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

120

Je recherche 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.

rudimenter
la source

Réponses:

212

obtenir aujourd'hui pas de temps:

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

obtenir hier pas de temps:

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

requête pour toutes les lignes d'hier seulement:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)
KM.
la source
@ashuthinks, votre commentaire n'a aucun sens pour moi. La question d'origine demande comment obtenir des lignes de la veille. Pour ce faire, vous devez être en mesure d'obtenir la date du jour uniquement (pas d'heure) et la date d'hier uniquement (pas d'heure). Vous utilisez ces dates (intemporelles) dans la clause `WHERE`. Cependant, le SELECT *renverra toutes les dates avec leurs heures d'origine.
KM.
daté donne "Erreur de décompte de paramètres incorrect". et stackoverflow.com/a/18926156/3007408 indique que Datatiff ne peut utiliser que 2 paramètres. Toute solution??
Sp0T
@ Sp0T, cette question est étiquetée SQL Server , qui a une fonction DATEDIFF () qui accepte trois paramètres ( msdn.microsoft.com/en-us/library/ms189794.aspx ) la question à laquelle vous liez est pour MySql, ce que je suppose fonctionne différemment comme vous l'avez trouvé. Vous constaterez que SQL n'est pas complètement interchangeable, il existe de nombreuses différences comme celle-ci entre les différents fournisseurs, en particulier en ce qui concerne la gestion des dates.
KM.
Ahh merci. Je ne savais pas ça. Btw j'ai résolu le problème en utilisant "entre curdate () -1 jour et curdate ()". Peut-être peut-il être utilisé dans ce cas également.
Sp0T
1
@RasmusBidstrup, oui. quand je cours SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)je reçois:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.
44

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": changez le -1 en -X.

Donc, pour toutes les lignes d'hier, vous obtenez:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())
Konamiman
la source
Le type de données «date» n'existe pas dans SQL Server 2005. Lorsque j'utilise datetime à la place, la valeur de l'heure reste et le calcul ne se produit pas de 0 h à 12 h, mais à partir du moment où vous exécutez la requête
rudimenter
1
Mon erreur. Je n'ai pas vu que vous utilisiez SQL Server 2005. En effet, mon code ne fonctionne que pour SQL Server 2008.
Konamiman
J'ai toujours pensé que DATEADD (jour, ....) était un gaspillage, il suffit d'ajouter ou de soustraire le nombre de jours par rapport à la date: SELECT GETDATE () - 1
KM.
18

Il semble que la réponse évidente manquait. Pour obtenir toutes les données d'une table (Ttable) où la colonne (DatetimeColumn) est une date / heure avec un horodatage, la requête suivante peut être utilisée:

SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday

Cela peut facilement être changé pour aujourd'hui, le mois dernier, l'année dernière, etc.

appelle moi Steve
la source
3
Celui-ci fonctionne plutôt bien, mais est beaucoup plus cher DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)que car il doit évaluer le DATEDIFF () sur chaque ligne
Václav Holuša
10
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
Romancha KC
la source
C'est le gagnant.
TmsKtel
5

C'est un fil vraiment vieux, mais voici mon point de vue. Plutôt que 2 clauses différentes, une supérieure et inférieure à. J'utilise cette syntaxe ci-dessous pour sélectionner les enregistrements à partir d'une date. Si vous voulez une plage de dates, les réponses précédentes sont la solution.

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

Rahul
la source
4

Impossible de le tester pour le moment, mais:

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)
Mark Bell
la source
3

Cela devrait le faire:

WHERE `date` = CURDATE() - INTERVAL 1 DAY
chandelier
la source
1
(Désolé) mais votre réponse est uniquement compatible MySQL, la question est pour SQL Server
StefanJCollier
2

Dans SQL Server, procédez comme suit:

where cast(columnName as date) = cast(getdate() -1 as date)

Vous devez convertir les deux côtés de l'expression à ce jour pour éviter les problèmes de mise en forme de l'heure.

Si vous avez besoin de contrôler l'intervalle plus en détail, vous devriez essayer quelque chose comme:

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)
Mário Meyrelles
la source
1

Une autre façon de dire "Hier" ...

Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))

Cela ne fonctionnera probablement pas bien le 1er janvier, ainsi que le premier jour de chaque mois. Mais à la volée, c'est efficace.

user3428292
la source
1

Eh bien, il est plus facile de convertir la colonne datetime en date et de la comparer.

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 
Amey P Naik
la source
0

subdate (now (), 1) renverra l'horodatage d'hier Le code ci-dessous sélectionnera toutes les lignes avec l'horodatage d'hier

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Dismi Paul
la source