2009-10-01 5 views

Répondre

148

obtenir aujourd'hui pas de temps:

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

obtenir yestersday pas de temps:

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

requête pour toutes les lignes de seulement hier:

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

SI J'AI BESOIN DE TEMPS AUSSI? – Neo

+0

@ashuthinks, votre commentaire n'a aucun sens pour moi. La question initiale demande comment obtenir les lignes de la journée précédente. Pour ce faire, vous devez être en mesure d'obtenir la date du jour seulement (pas de temps) et la date d'hier seulement (pas de temps). Vous utilisez ces dates (intemporelles) dans la clause WHERE. Cependant, le 'SELECT *' retournera toutes les dates avec leurs heures d'origine. –

+0

datediff indique "Erreur de nombre de paramètres incorrect". et http://stackoverflow.com/a/18926156/3007408 dit que datediff ne peut utiliser que 2 paramètres. Toute solution?? – Sp0T

4

ne peut pas tester dès maintenant, mais:

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

Pour obtenir la valeur "aujourd'hui" dans 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()) 
+0

« date » du type de données ne marche pas exister dans SQL Server 2005. Lorsque j'utilise datetime au lieu des séjours de valeur de temps et le calcul ne se passe pas de 0h du matin à 12h mais à partir du moment où vous exécutez la requête – rudimenter

+1

Mon erreur. Je n'ai pas vu que vous traitiez avec SQL Server 2005. En effet, mon code fonctionne uniquement pour SQL Server 2008. – Konamiman

+0

J'ai toujours pensé que DATEADD (jour, ....) était une perte, il suffit d'ajouter ou de soustraire le nombre de jours par rapport à la date: _SELECT GETDATE() - 1_ –

5

C'est un très vieux fil, mais voici mon point de vue. Plutôt que deux clauses différentes, une plus grande que moins de. J'utilise cette syntaxe ci-dessous pour sélectionner les enregistrements d'une date. Si vous voulez une plage de dates, alors les réponses précédentes sont le chemin à parcourir.

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

Dans le cas X ci-dessus sera -1 pour les dossiers d'hier

7
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY); 
1

Une autre façon de le dire "Yesterday" ...

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

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

12

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

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

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

1

cela devrait le faire:

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

Dans SQL Server comme cela:

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 formatage de l'heure.

Si vous avez besoin de contrôler l'intervalle plus en détail, alors 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) 
Questions connexes