我为某个日期范围收到的退货订单写了一个查询。目标是在几小时内找到在线和商店的订单。但是,订单返回的日期范围之外的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
答案 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语句进行分组。