whereNotBetween 给我错误
whereNotBetween giving me error
我正在尝试编写 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)
如果交易日期 > $start_time AND $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
您必须使用原始查询,您正在使用的查询将无法工作,因为您使用的是别名,trade_date 列不存在,是一个别名...因此您必须使用子查询直接像:whereRaw('NOT (TIME(trades.tradedate) BETWEEN exchanges.start_time AND exchanges.end_time)')
我假设你有一个 end_time 列...你必须定义一个范围...对于 Between...如果没有,直接使用 IS EQUAL
或 =
运营商...
**编辑 2 **
您的范围对于 BETWEEN 比较无效。
如果交换在一天的 09:00 上午开始并在第二天的 03:00 上午结束
9 和 3 之间将没有任何内容,因为范围必须增加。上午 9 点到下午 3 点不是有效范围。
为此,您需要更复杂的查询...
类似于
->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 天
伪造的日期
我正在尝试编写 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 jointrades
onexchanges
.id
=trades
.exchange_id
wheretrades
.user_id
= 1 andtrade_date
not between exchanges.start_time and exchanges.start_time)
如果交易日期 > $start_time AND $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
您必须使用原始查询,您正在使用的查询将无法工作,因为您使用的是别名,trade_date 列不存在,是一个别名...因此您必须使用子查询直接像:whereRaw('NOT (TIME(trades.tradedate) BETWEEN exchanges.start_time AND exchanges.end_time)')
我假设你有一个 end_time 列...你必须定义一个范围...对于 Between...如果没有,直接使用 IS EQUAL
或 =
运营商...
**编辑 2 **
您的范围对于 BETWEEN 比较无效。
如果交换在一天的 09:00 上午开始并在第二天的 03:00 上午结束
9 和 3 之间将没有任何内容,因为范围必须增加。上午 9 点到下午 3 点不是有效范围。
为此,您需要更复杂的查询...
类似于
->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 天
伪造的日期