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
3 réponses
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)
)
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
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.
De nouvelles questions
sql
Le langage de requête structuré (SQL) est un langage permettant d'interroger des bases de données. Les questions doivent inclure des exemples de code, une structure de table, des exemples de données et une balise pour l'implémentation du SGBD (par exemple MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.) utilisés. Si votre question concerne uniquement un SGBD spécifique (utilise des extensions / fonctionnalités spécifiques), utilisez plutôt la balise de ce SGBD. Les réponses aux questions marquées avec SQL doivent utiliser le standard SQL ISO / IEC.