WhereNotBetween дает мне ошибку

Я пытаюсь написать запрос whereNotBetween, но не понимаю, в чем моя ошибка. это не дает мне результата. Я знаю, что это ошибка, когда я пишу рядом с линией whereNotBetween. Другого примера нет.

$values = DB::table('exchanges')
            ->leftJoin('trades', 'exchanges.id', '=', 'trades.exchange_id')
            ->select('trades.*')
            ->where('trades.user_id', $user)

           ->whereRaw('TIME(trades.tradedate) NOT BETWEEN exchanges.start_time AND exchanges.close_time')


            ->get();

Unknown column 'trade_date' in 'where clause' (SQL: select TIME(trades.tradedate) AS trade_date from exchanges left join trades on exchanges.id = trades.exchange_id where trades.user_id = 1 and trade_date not between exchanges.start_time and exchanges.start_time)

Я хочу получить результат, если tradedate> $ start_time И $ tradedate <$ close_time, тогда мне нужен результат.

WhereNotBetween дает мне ошибкуWhereNotBetween дает мне ошибку

это между диапазоном .. но это дает мне результат:

 #items: array:69 [▼
0 => {#1106 ▼
  +"id": 3
  +"exchange": "NSE"
  +"created_at": "2018-04-18 13:00:23"
  +"updated_at": "2018-08-14 06:48:24"
  +"deleted_at": null
  +"start_time": "09:15:00"
  +"close_time": "03:30:00"
  +"country_id": null
  +"user_id": 1
  +"symbol_id": 7
  +"exchange_id": 1
  +"market_id": 1
  +"is_action": 1
  +"rate": 13234
  +"tradedate": "2018-06-21 09:20:00"
  +"note": "Kinnari updated"
  +"quantities": 456
  +"stoploss": 6465

Используйте <или> в запросе, а не между

Adnan Mumtaz 20.08.2018 11:07
->whereRaw('TIME(trades.tradedate) NOT **OR** exchanges.start_time AND exchanges.close_time') нравится @AdnanMumtaz
KINNARI 20.08.2018 11:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать необработанный запрос, тот, который вы используете, не будет работать, потому что вы используете псевдоним, столбец trade_date не существует, это псевдоним ... поэтому вам придется использовать подзапрос напрямую, например: whereRaw('NOT (TIME(trades.tradedate) BETWEEN exchanges.start_time AND exchanges.end_time)')

Я предполагаю, что у вас есть столбец end_time ... вам нужно определить диапазон ... для Between ... если нет, просто используйте напрямую операторы IS EQUAL или = ...

** Редактировать 2 **

Ваши диапазоны недействительны для сравнения МЕЖДУ.

Если обмен начинается в 09:00 одного дня и заканчивается в 03:00 следующего дня

Между 9 и 3 не будет ничего, потому что диапазон должен увеличиться. С 9:00 до 15:00 недопустимый диапазон.

Для этого вам понадобится более сложный запрос ...

Что-то типа

->whereRaw("NOT
( 
   trades.tradedate 
   BETWEEN 
   (CONCAT(DATE(trades.tradedate), ' ', exchanges.start_time)) 
   AND 
   (CASE 
       WHEN exchanges.close_time > exchanges.start_time 
           THEN (CONCAT(DATE(DATE_ADD(trades.tradedate, INTERVAL 1 DAY)), ' ', exchanges.close_time))
       ELSE (CONCAT(DATE(trades.tradedate), ' ', exchanges.close_time))
   )
)");

Этот запрос очень прост: он сравнивает, находится ли дата между действительной датой, если период в один и тот же день, он просто добавляет ту же дату, если период не в тот же день, он добавляет дату, подделанную с date_add 1 день

Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат.

Bhargav Rao 20.08.2018 01:45

Привет, @Erubiel, я устал от этого кода, выдает ошибку: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') )' at line 11 (SQL: ......

KINNARI 20.08.2018 11:23

Другие вопросы по теме