Я пытаюсь написать запрос 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
exchangesleft jointradesonexchanges.id=trades.exchange_idwheretrades.user_id= 1 andtrade_datenot between exchanges.start_time and exchanges.start_time)
Я хочу получить результат, если tradedate> $ start_time И $ tradedate <$ close_time, тогда мне нужен результат.
это между диапазоном .. но это дает мне результат:
#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
->whereRaw('TIME(trades.tradedate) NOT **OR** exchanges.start_time AND exchanges.close_time') нравится @AdnanMumtaz






Вы должны использовать необработанный запрос, тот, который вы используете, не будет работать, потому что вы используете псевдоним, столбец 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 день
Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат.
Привет, @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: ......
Используйте <или> в запросе, а не между