2017-11-25 12 views
0

特定の日付範囲で受け取った返品注文のクエリを作成しました。目標は、オンラインとストアのために数時間で注文を見つけることです。ただし、注文はORDER_IDを返し、日付範囲外です。ここに私の質問です。私は返さORDER_IDの一つでクエリを実行するとSQL Serverの日付範囲クエリが期待どおりに機能しない

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') 

は今、それが下の日付値外の日付範囲を返します。

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時の間、同じ日に注文が行われた場合など、数時間ごとに注文を見つけるためにクエリを修正するにはどうすればよいですか?

提案を試したところ、日付範囲に行があるにもかかわらず、行が表示されませんでした。

+1

あなたはANDとORを混在させましたが、問題を避けるために括弧で囲んでください。 – Zorkolot

答えて

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) 
    ) 
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'  
     ) 

ようにする必要があり、どこか

0

をあなたが混合してのとORの一緒にしました。 1つの解決策は、OR演算子を持つ2つのステートメントの代わりにINをTRANSACTION_TYPEに使用することです。これにより、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文をグループ化することもできます。

関連する問題