我正在尝试编写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();
“ where子句”中的未知列“ trade_date”(SQL:从
exchanges
到trades
的{{1}}左联接exchanges
,选择TIME(trades.tradedate)AS trade_date。id
=trades
。exchange_id
,其中trades
。user_id
= 1和trade_date
不在exchanges.start_time和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
答案 0 :(得分:1)
您必须使用Raw查询,因为您使用的是别名,所以您将无法使用该查询,因为trade_date列不存在,所以是别名...因此您必须直接使用子查询,例如:{ {1}}
我假设您有一个end_time列...您必须为...之间定义一个范围...如果没有,则直接使用whereRaw('NOT (TIME(trades.tradedate) BETWEEN exchanges.start_time AND exchanges.end_time)')
或IS EQUAL
运算符... >
**编辑2 **
您的范围对于BETWEEN比较无效。
如果交换在一天的09:00 AM开始并在第二天的03:00 AM结束
9到3之间没有任何值,这是因为该范围必须增大。 9AM到3PM是无效范围。
为此,您需要一个更复杂的查询...
类似
=
此查询的操作非常简单,它比较日期是否在有效日期之间,如果期间在同一天,则只是追加相同的日期,如果期间不在同一天,则追加用date_add 1天伪造的日期