SQL Server日期范围查询未按预期工作

时间:2017-11-25 02:40:03

标签: sql sql-server date

我为某个日期范围收到的退货订单写了一个查询。目标是在几小时内找到在线和商店的订单。但是,订单返回的日期范围之外的ORDER_ID。这是我的询问。

SELECT 
    ORDER_ID 
FROM 
    ORDERS 
WHERE 
    TRANSACTION_TYPE = 'ONLINE' OR TRANSACTION_TYPE = 'STORE' 
    AND ORDER_COUNT > 0 
    AND (ORDER_DATE >= '2017-11-20 02:04:25.247' 
         AND ORDER_DATE< '2017-11-20 02:06:40.887')

现在,当我使用返回的ORDER_ID之一运行查询时,它会返回较低日期值之外的日期范围。

  SELECT ORDER_DATE FROM ORDERS WHERE ORDER_ID=104 

  ORDER_DATE
  -----------
  2017-11-24 10:10:14.520

这显然是不正确的。当日期范围应该在2017-11-20 02:04:25.247和2017-11-20 02:06:40.887之间时,为什么它返回的日期大于2017-11-20?

如何修复查询以查找相隔几个小时的订单,例如在下午3点到晚上8点之间的同一天订单?

当我尝试这个建议时,我没有获得任何行,即使日期范围内有行。

ORDER_ID    ORDER_DATE              TRANSACTION_TYPE
433         2017-11-20 02:04:25.247         ONLINE
448         2017-11-20 02:06:40.887         ONLINE

3 个答案:

答案 0 :(得分:1)

您的WHERE条件错误。也许应该是这样的

WHERE  (    -- added this
             TRANSACTION_TYPE = 'ONLINE' 
        OR   TRANSACTION_TYPE = 'STORE' 
       )    -- added this
AND    ORDER_COUNT > 0 
AND    (     
             ORDER_DATE >= '2017-11-20 02:04:25.247' 
        AND  ORDER_DATE <  '2017-11-20 02:06:40.887'    
       )

你错过了一些括号()某处

答案 1 :(得分:0)

这有效:

     WHERE(    
         TRANSACTION_TYPE = 'ONLINE'
         OR          
         TRANSACTION_TYPE = 'STORE' 
   )    

   AND  ORDER_COUNT > 0 

   AND 
   (     

     ORDER_DATE <CURRENT_TIMESTAMP 

     AND

     ORDER_DATE > DATEADD(hh,-3,CURRENT_TIMESTAMP)  
    )

答案 2 :(得分:0)

你把AND和OR混在了一起。一种解决方案是使用IN作为TRANSACTION_TYPE而不是使用OR运算符的两个语句。这避免了AND和OR的混合。

SELECT ORDER_ID 
  FROM ORDERS 
 WHERE TRANSACTION_TYPE IN ('ONLINE', 'STORE')
   AND ORDER_COUNT>0 
   AND ORDER_DATE >= '2017-11-20 02:04:25.247' 
   AND ORDER_DATE< '2017-11-20 02:06:40.887'

另一种可能性是使用括号对OR语句进行分组。