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 天

伪造的日期