136 votes

Instruction SQL pour sélectionner toutes les lignes du jour précédent

Je cherche une bonne instruction SQL pour sélectionner toutes les lignes du jour précédent dans une table. La table contient une colonne datetime. J'utilise SQL Server 2005.

239voto

KM. Points 51800

Obtenir aujourd'hui sans délai :

SELECT dateadd(day,datediff(day,0,GETDATE()),0)

obtenir hier en un rien de temps :

SELECT dateadd(day,datediff(day,1,GETDATE()),0)

pour toutes les lignes de la journée d'hier :

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)

0 votes

@ashuthinks, votre commentaire n'a aucun sens pour moi. La question initiale demande comment obtenir les lignes du jour précédent. Pour ce faire, vous devez être en mesure d'obtenir la date d'aujourd'hui uniquement (sans heure) et la date d'hier uniquement (sans heure). Vous utilisez ces dates (intemporelles) dans la clause "WHERE". Cependant, la clause SELECT * renverra toutes les dates avec leur heure d'origine.

0 votes

Datediff donne "Incorrect Parameter Count error" (erreur de nombre de paramètres incorrects) et stackoverflow.com/a/18926156/3007408 indique que datediff ne peut utiliser que 2 paramètres. une solution ?

0 votes

@Sp0T, cette question est taguée Serveur SQL qui possède une fonction DATEDIFF() acceptant trois paramètres ( msdn.microsoft.com/en-us/library/ms189794.aspx ) la question à laquelle vous renvoyez est pour MySql, qui je suppose fonctionne différemment comme vous l'avez constaté. Vous constaterez que SQL n'est pas complètement interchangeable, il existe de nombreuses différences de ce type entre les différents fournisseurs, en particulier en ce qui concerne la gestion des dates.

53voto

Konamiman Points 20578

Pour obtenir la valeur "aujourd'hui" en SQL :

convert(date, GETDATE())

Pour obtenir "hier" :

DATEADD(day, -1, convert(date, GETDATE()))

Pour obtenir "aujourd'hui moins X jours", remplacez le -1 par -X.

Ainsi, pour tous les rangs d'hier, vous obtenez.. :

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())

0 votes

Le type de données "date" n'existe pas dans SQL Server 2005. Lorsque j'utilise datetime à la place, la valeur de l'heure est conservée et le calcul s'effectue non pas de 0h à 12h mais à partir de l'heure à laquelle vous exécutez la requête.

1 votes

C'est une erreur de ma part. Je n'avais pas vu que vous utilisiez SQL Server 2005. En effet, mon code ne fonctionne que pour SQL Server 2008.

0 votes

J'ai toujours pensé que DATEADD(day,....) était un gaspillage, il suffit d'ajouter ou de soustraire le nombre de jours par rapport à la date : SELECT GETDATE()-1

12voto

Romancha KC Points 457
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);

0 votes

Voici le gagnant.

6voto

Rahul Points 161

Il s'agit d'un très vieux sujet, mais voici mon point de vue sur la question. Plutôt que 2 clauses différentes, une plus grande que et une plus petite que. J'utilise la syntaxe ci-dessous pour sélectionner les enregistrements à partir de la date A. Si vous voulez une plage de dates, les réponses précédentes sont la meilleure façon de procéder.

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0

Dans le cas ci-dessus, X sera -1 pour les enregistrements d'hier.

4voto

Mark Bell Points 11287

Je ne peux pas le tester pour l'instant, mais.. :

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X