web-dev-qa-db-de.com

Datetime in der where-Klausel

Wie kann ich den 20.12.2008 in der where -Klausel von sql auswählen?

Der Server ist SQL Server 2005.

select * from tblErrorLog
where errorDate = '12/20/2008'
51
WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
72
LukeH

Zuallererst würde ich empfehlen, das ISO-8601-Standardformat für Datum/Uhrzeit zu verwenden - es funktioniert unabhängig von der Sprache und den regionalen Einstellungen auf Ihrem SQL Server. ISO-8601 ist das Format YYYYMMDD - keine Leerzeichen, keine Striche - nur die Daten:

select * from tblErrorLog
where errorDate = '20081220'

Zweitens müssen Sie sich darüber im Klaren sein, dass SQL Server 2005 DATETIME immer eine Uhrzeit enthält. Wenn Sie nur mit dem Datumsteil auf genaue Übereinstimmung prüfen, erhalten Sie nur Zeilen, die mit einer Zeit von 0:00:00 übereinstimmen - sonst nichts.

Sie können entweder eine der angegebenen empfohlenen Bereichsabfragen verwenden oder in SQL Server 2008 nur die Datums- und Uhrzeitangabe DATE verwenden. Sie können auch Folgendes durchführen:

select * from tblErrorLog
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008

Was auch immer für Sie am besten funktioniert.

Wenn Sie diese Abfrage häufig ausführen müssen, können Sie entweder versuchen, das DATETIME so zu normalisieren, dass es nur das Datum enthält, oder Sie können berechnete Spalten für DAY, MONTH und YEAR hinzufügen:

ALTER TABLE tblErrorLog
   ADD ErrorDay AS DAY(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorYear AS YEAR(ErrorDate) PERSISTED

und dann könnten Sie leichter abfragen:

select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009

und so weiter. Da diese Felder berechnet und PERSISTED sind, sind sie immer auf dem neuesten Stand und immer aktuell. Da sie peristed sind, können Sie sie bei Bedarf sogar indizieren.

24
marc_s

Sie sagen nicht, welche Datenbank Sie verwenden, aber in MS SQL Server wäre es

WHERE DateField = {d '2008-12-20'}

Wenn es sich um ein Zeitstempelfeld handelt, benötigen Sie einen Bereich:

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
15
J__

Angenommen, wir sprechen von SQL Server DateTime

Hinweis: ZWISCHEN schließt beide das Ende des Bereichs ein. Technisch gesehen ist dieses Muster also falsch:

errorDate BETWEEN '12/20/2008' AND '12/21/2008'

Meine bevorzugte Methode für einen solchen Zeitraum ist:

'20081220' <= errorDate AND errordate < '20081221'

Funktioniert mit gängigen Indizes (Range Scan, SARGable, funktionslos) und schneidet Mitternacht des nächsten Tages korrekt ab, ohne auf die Zeitgranularität von SQL Server angewiesen zu sein (z. B. 23: 59: 59.997).

7
onupdatecascade

Verwenden Sie eine Konvertierungsfunktion, um alle Einträge für einen bestimmten Tag abzurufen.

Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'

Siehe CAST und CONVERT für weitere Informationen

5
Middletone
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
1
Meff