J'ai écrit une requête pour les commandes de retour reçues pour une certaine plage de dates. L'objectif est de retrouver les commandes passées en quelques heures pour en ligne et en magasin. Cependant, la commande renvoie des ORDER_ID qui sont en dehors de la plage de dates. Voici ma question.

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

Maintenant, lorsque j'exécute une requête avec l'un des ORDER_ID renvoyé, il renvoie une plage de dates en dehors de la valeur de date inférieure.

  SELECT ORDER_DATE FROM ORDERS WHERE ORDER_ID=104 

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

Ceci est clairement incorrect. Pourquoi renvoie-t-il une date supérieure au 20/11/2017 alors que la plage de dates est censée être comprise entre le 20/11/2017 02: 04: 25.247 et le 20/11/2017 02: 06: 40.887?

Comment puis-je corriger la requête pour trouver des commandes à quelques heures d'intervalle, par exemple des commandes passées le même jour entre 15h et 20h?

Lorsque j'ai essayé la suggestion, je n'obtiens aucune ligne, même s'il y a des lignes dans la plage de dates.

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
BreenDeen 25 nov. 2017 à 05:40

3 réponses

Meilleure réponse

Cela a fonctionné:

     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)  
    )
0
BreenDeen 25 nov. 2017 à 03:41

Votre condition WHERE est incorrecte. Peut-être devrait être comme ça

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

Vous avez manqué des parenthèses () quelque part

1
Squirrel 25 nov. 2017 à 02:46

Vous avez mélangé les AND et les OR ensemble. Une solution consiste à utiliser IN pour TRANSACTION_TYPE au lieu de deux instructions avec l'opérateur OR. Cela évite de mélanger ET et OU.

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'

Une autre possibilité consiste à utiliser des parenthèses pour regrouper les instructions OR.

0
Zorkolot 25 nov. 2017 à 07:50
47482161