Wie kann ich mit einem Datum im SQL Server am besten umgehen?

Veröffentlicht: 16. Jul 2007
Von Ruprecht Dröge

Lösung

Datumswerte werden im SQL über eine Zeichenfolge eingegeben. Dabei muss das richtige Format beachtet werden. Außerdem wird immer auch eine Uhrzeit mitgespeichert. Daher muss man bei Datumsbereichen auf die richtigen End- und Anfangsdaten achten.

In der Dokumentation heißt es:

Werte vom Datentyp datetime werden von SQL Server 2005 Database Engine (Datenbankmodul) intern als zwei 4 Bytes lange ganze Zahlen gespeichert. Die ersten 4 Bytes enthalten die Anzahl von Tagen vor oder nach dem Basisdatum, dem 1. Januar 1900. Das Basisdatum ist das Referenzdatum des Systems. In den anderen 4 Bytes ist die Tageszeit gespeichert, die als Anzahl von 1/300-Sekunden-Einheiten seit Mitternacht dargestellt wird.

Der smalldatetime-Datentyp speichert Datum und Tageszeit mit geringerer Genauigkeit als datetime In Database Engine (Datenbankmodul) werden smalldatetime-Werte als zwei ganze Zahlen mit einer Länge von 2 Bytes gespeichert. Die ersten 2 Bytes enthalten die Anzahl von Tagen seit dem 1. Januar 1900. Die anderen 2 Bytes speichern die Anzahl von Minuten seit Mitternacht.

(aus der Online Doku, Hervorhebung durch mich)

Mit anderen Worten, wer nur Daten nach dem 1.1.1900 verwalten muss, für den reicht in den allermeisten Fällen smalldatetime. Es macht aber auch deutlich, dass immer eine Zeit mit gespeichert wird.

Beachten Sie aber folgendes Beispiel:

CREATE TABLE Datumswerte
(Id int identity primary key,
Anlass nvarchar(80),
Datum datetime)

GO

INSERT INTO Datumswerte Values ('STC Duisburg','21.5.2007')
INSERT INTO Datumswerte Values ('BI Conference Seattle','09.5.2007')
INSERT INTO Datumswerte Values ('Webcast SQL Reihe Part 3','02.5.2007')
INSERT INTO Datumswerte Values ('Ende Mai','31.5.2007 23:59')

GO
SELECT * FROM Datumswerte
GO
SELECT * FROM Datumswerte WHERE Datum>='1.5.2007' and Datum<='31.5.2007'        
  

Bei dem Vergleich mit Datum <=31.5.2007 wird, da der SQL Server immer auch eine Uhrzeit mit speichert, 31.5.2007 00:00 mitgedacht, also die erste Sekunde des 31.5. Dieses Datum liegt aber vor dem 31.5.2007 23:59 – der letzte Datensatz wird nicht ausgegeben!

Außerdem ist das Datum sprachenabhängig.

SET LANGUAGE us_english
INSERT INTO Datumswerte Values ('Ende Mai','1.5.2007')
SELECT * FROM Datumswerte 
SET LANGUAGE german        
  

Daher ist es zu empfehlen, das Datum über das ISO-Format einzugeben. Es lautet:

yyyy-mm-ddThh:mm:ss[.mmm]

Dokumentation zu Datum und Uhrzeit: http://msdn2.microsoft.com/de-de/library/ms187819.aspx

Fragen?

Im Blog: http://blogs.sqlserverfaq.de oder an droege@beconstructed.de