2009-07-30 5 views
4

Dites que j'ai une table qui stocke les ID de commande des clients. Tels queAide sur les instructions SQL - Sélectionnez les clients qui ont commandé aujourd'hui

| Identifiant client | Identifiant de commande | Date de commande

Comment puis-je obtenir tous les clients qui ont commandé aujourd'hui?

En outre OrderDate serait un DateTime.

Quelque chose comme

SELECT DISTINCT CustomerID 
FROM TableName 
Where OrderDate > Today 

Mais la dernière partie est ce que je ne peux pas comprendre.

Répondre

3

Il est assez commun à ne veulent une date d'un datetime - vous devriez être en mesure de Google pour les spécificités de votre SGBDR (puisque vous ne le mentionnez pas). Le bit important est de faire votre demande SARGable en transformant aujourd'hui date - pas la date de la commande.

Pour MSSQL, quelque chose comme

SELECT DISTINCT CustomerID 
FROM TableName 
--I assume you want midnight orders as well - so use >= 
Where OrderDate >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

travaillerait en prenant le nombre de jours est aujourd'hui de date 0 (DATEDIFF(dd, 0, GETDATE())) et les rajoutant à ce jour 0 (DATEADD(dd, 0, x)). C'est spécifique à T-SQL, cependant.

Si vous recherchez une date arbitraire, vous auriez encore transformez les deux arguments:

SELECT DISTINCT CustomerID 
FROM TableName 
Where 
    OrderDate >= DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
    --You *do not* want midnight of the next day, as it would duplicate orders 
    AND OrderDate < DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()) + 1) 
0

Dans Oracle la déclaration ressemblerait à quelque chose comme:

SELECT DISTINCT CustomerID 
FROM TableName 
Where OrderDate >= trunc(sysdate) 

SQL Server doit être similaire

+0

SQL Server ne dispose pas d'une déclaration 'trunc'. – Eric

+0

Wow. Je dois me rappeler que la prochaine fois que j'interviewer un candidat. Chaque mois, j'interview quelqu'un et j'entends quelque chose comme "SQL is SQL". Il ne semble pas important qu'ils utilisent SQL Server depuis des années et nous sommes un magasin Oracle. –

0
SELECT DISTINCT CustomerID 
FROM TableName 
Where OrderDate = CAST(GetDate() AS NUMERIC) 

OU

SELECT DISTINCT CustomerID 
FROM TableName 
Where CAST(OrderDate AS NUMERIC) = CAST(GetDate() AS NUMERIC) 

J'ai essayé de voir qu'il retourne le même nombre pour la date donnée avec un temps différent. Donc, cela devrait fonctionner quand une date est convertie en sa valeur numérique.

SELECT CAST(0 AS DATETIME) retours 1/1/1900 0:00:00

Questions connexes