2009-10-01 8 views

Antwort

148

heute keine Zeit bekommen:

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

keine Zeit yestersday erhalten:

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

Abfrage für alle Zeilen aus nur gestern:

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

WENN ICH DIE ZEIT AUCH DANN MÖCHTE? – Neo

+0

@ashuthinks, macht Ihren Kommentar für mich keinen Sinn. Die ursprüngliche Frage fragt, wie Zeilen vom vorherigen Tag abgerufen werden. Um das zu tun, müssen Sie nur das heutige Datum (keine Zeit) und das Datum von gestern (keine Zeit) haben. Sie verwenden diese (zeitlosen) Daten in der WHERE-Klausel. Die 'SELECT * 'gibt jedoch alle Daten mit ihren ursprünglichen Zeiten zurück. –

+0

datediff gibt "Falsche Parameteranzahl Fehler". und http://stackoverflow.com/a/18926156/3007408 sagt datediff kann nur 2 Parameter verwenden. irgendeine Lösungsmöglichkeit?? – Sp0T

4

Kann es jetzt nicht testen, aber:

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

den "heute" Wert in SQL zu erhalten:

convert(date, GETDATE()) 

Um "gestern" :

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

Um "heute minus X Tage" zu erhalten: ändern Sie die -1 in -X.

Also für alle Reihen von gestern, erhalten Sie:

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

„date“ Datentyp leider nicht in der SQL-Server existiert 2005. Wenn ich Datetime verwenden, anstatt die Zeit Wert bleibt und die Berechnung passiert nicht von 0 Uhr bis 12 Uhr, aber von der Zeit, die Sie die Abfrage ausführen – rudimenter

+1

Mein Fehler. Ich habe nicht gesehen, dass Sie mit SQL Server 2005 gearbeitet haben. Tatsächlich funktioniert mein Code nur für SQL Server 2008. – Konamiman

+0

Ich dachte immer, dass DATEADD (Tag, ....) eine Verschwendung wäre, addiere oder subtrahiere einfach die Anzahl der Tage gegen das Datum: _SELECT GETDATE() - 1_ –

5

Es ist ein wirklich alter Thread, aber hier ist meine Meinung dazu. Eher als 2 verschiedene Klauseln, eine größer als und kleiner als. Ich benutze diese Syntax unten für die Auswahl von Datensätzen von A-Datum. Wenn Sie einen Datumsbereich möchten, sind vorherige Antworten der richtige Weg.

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

Im obigen Fall X wird -1 für Aufzeichnungen von gestern sein

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

Ein anderer Weg, es zu sagen, "Yesterday" ...

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

denkbar Das wird nicht funktionieren gut am 1. Januar sowie am ersten Tag eines jeden Monats. Aber im Flug ist es effektiv.

12

Es scheint die offensichtliche Antwort fehlte. Um alle Daten aus einer Tabelle zu erhalten (Ttable), wobei die Säule (DatetimeColumn) ist ein Datetime mit einem Zeitstempel der folgende Abfrage verwendet werden kann:

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

Dies kann leicht bis heute, im letzten Monat geändert werden, im letzten Jahr,

usw.
1

Dies sollte es tun:

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

In SQL Server wie folgt tun:

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

Sie sollten beide Seiten des Ausdrucks auf den aktuellen Stand bringen, um Probleme mit der Zeitformatierung zu vermeiden.

Wenn Sie Intervall genauer steuern müssen, dann sollten Sie so etwas wie versuchen:

declare @start datetime = cast(getdate() - 1 as date) 
declare @end datetime = cast(getdate() - 1 as date) 
set @end = dateadd(second, 86399, @end) 
Verwandte Themen