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.

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)

@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())

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.


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


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


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)

3

Cela devrait le faire:

WHERE `date` = CURDATE() - INTERVAL 1 DAY

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)

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.


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

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.