Die größten Probleme mit SQL-Datumsfunktionen und deren Lösungen
Björn Peters
5. März 2025

Einleitung
Datumsfunktionen in SQL sind mächtige Werkzeuge, doch sie sind auch eine der häufigsten Fehlerquellen in Datenbankabfragen und Anwendungen. Datenbankadministratoren (DBAs) und Entwickler begegnen immer wieder Problemen mit der Verarbeitung, Speicherung und Umwandlung von Datumswerten. Diese Probleme führen oft zu inkonsistenten Ergebnissen, Leistungsproblemen oder sogar Datenverlust.
In diesem Beitrag zeige ich die häufigsten Herausforderungen bei der Arbeit mit Datumsfunktionen in SQL auf, erkläre, wie sie sich äußern, und stelle mögliche Lösungsansätze mit ihren jeweiligen Vor- und Nachteilen vor.
1. Unterschiedliche Datumsformate und ihre Folgen
Eines der größten Probleme ist die unterschiedliche Interpretation von Datumsformaten in SQL Server. Während einige Sprachen und Clients das Format YYYY-MM-DD erwarten, interpretieren andere DD-MM-YYYY. Dies kann zu unerwarteten Ergebnissen führen, insbesondere wenn Datumswerte als VARCHAR oder NVARCHAR gespeichert werden.
Beispielproblem
SELECT CAST('01-02-2023' AS DATE)
Je nach SQL Server-Instanz und regionalen Einstellungen kann dies entweder den 1. Februar 2023 oder den 2. Januar 2023 zurückgeben.
Lösung
- Best Practice: Immer
YYYYMMDDfürDATEundDATETIMEverwenden, um Missverständnisse zu vermeiden.
SELECT CAST('20230201' AS DATE)
- Alternativ: Die explizite Angabe einer Sprach- oder Formatoption in der Abfrage
SET LANGUAGE English;
SELECT CAST('01-02-2023' AS DATE);

2. Probleme mit Zeitzonen und UTC-Umrechnung
Viele Unternehmen nutzen verteilte Systeme, die in verschiedenen Zeitzonen arbeiten. Ohne ein konsistentes Zeitzonenhandling entstehen schnell Probleme mit der korrekten Zeitberechnung.
Symptome
- Daten zeigen unerwartete Verschiebungen in
DATETIME– oderDATETIMEOFFSET-Spalten. - Bei Vergleichen oder Berechnungen stimmen die Werte nicht mit den Erwartungen überein.
Lösungen
- Immer mit UTC arbeiten:
SELECT GETUTCDATE();
- Zeitzoneninformationen mit
AT TIME ZONEkorrekt umwandeln:
-- Lokale Zeit für Berlin (Deutschland)
SELECT
GETUTCDATE() AS UTC_Time,
SYSDATETIMEOFFSET() AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time' AS Berlin_LocalTime;
-- Lokale Zeit für Seattle (USA)
SELECT
GETUTCDATE() AS UTC_Time,
SYSDATETIMEOFFSET() AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS Seattle_LocalTime;
Vorteile:
✔ Keine Abhängigkeit von Server- oder Session-Einstellungen
✔ Automatische Berücksichtigung von Sommer- und Winterzeit
✔ Korrekte Umrechnung bei verteilten Systemen
Nachteile:
❌ Erhöhter Speicherbedarf durch DATETIMEOFFSET
❌ Komplexere Abfragen bei Zeitzonenberechnungen

3. Berechnungsfehler durch DATEDIFF und DATEADD
DATEDIFF wird häufig zur Berechnung von Zeiträumen verwendet, liefert aber oft unerwartete Ergebnisse, insbesondere bei DATETIME-Werten.
Problem: Ungenaue Berechnung von Tagesunterschieden
Angenommen, wir möchten die Differenz zwischen zwei Zeitstempeln berechnen:
SELECT DATEDIFF(DAY, '2023-02-28 23:59:59', '2023-03-01 00:00:00')
Erwartet: 1 Tag
Tatsächlich: 1 Tag (scheinbar korrekt, aber problematisch in anderen Fällen)
Problematisch wird es, wenn ein Zeitstempel knapp an einer Tagesgrenze liegt:
SELECT DATEDIFF(DAY, '2023-03-01 00:00:00', '2023-03-01 23:59:59')
Hier beträgt das Ergebnis 0, obwohl fast ein ganzer Tag vergangen ist. Das liegt daran, dass DATEDIFF nur die Differenz zwischen den Tagen als ganze Einheiten zählt.
Problem: Fehlerhafte Monatsdifferenz
Ein weiteres Beispiel betrifft Monatsberechnungen:
SELECT DATEDIFF(MONTH, '2023-01-31', '2023-02-01')
Erwartet: 0, da nur ein Tag vergangen ist.
Tatsächlich: 1, da sich der Monatswert geändert hat.
Lösung
- Exakte Differenzberechnung mit Sekundenauflösung und Umrechnung auf Tage:
SELECT DATEDIFF(SECOND, '2023-01-01 23:59:59', '2023-01-02 00:00:01') / 86400.0 AS ExactDays;
Diese Methode liefert genauere Ergebnisse für tagesgenaue Berechnungen, indem die Anzahl der Sekunden durch die Gesamtanzahl an Sekunden pro Tag geteilt wird.
- Nutzung von
EOMONTH, um Monatsgrenzen korrekt zu erkennen:
SELECT EOMONTH('2023-01-15');
Dies gibt den letzten Tag des Monats zurück und hilft, Monatsberechnungen robuster zu gestalten.
Vorteile:
✔ Genauere Berechnungen von Zeiträumen
✔ Reduziert Fehler durch Zeitsprünge
Nachteile:
❌ Komplexere Abfragen, insbesondere bei vielen Berechnungen
Fazit
Datums- und Zeitfunktionen sind essenziell in SQL, aber oft fehleranfällig.
- Konsistente Datentypen verwenden:
DATETIME2undDATETIMEOFFSETsolltenDATETIMEbevorzugt werden, um Genauigkeit zu verbessern und Zeitzonenprobleme zu minimieren. - UTC als Standard speichern: Die Speicherung von Zeitstempeln in UTC und spätere Umwandlung in die lokale Zeitzone ist eine bewährte Praxis, um Fehler zu vermeiden.
- Bei Berechnungen auf Details achten:
DATEDIFFkann unerwartete Werte liefern, daher sind genauere Berechnungen mitDATEDIFF(SECOND)oder Zeitstempel-Normalisierung oft die bessere Wahl. - Datumsformate standardisieren: Verwendung von
YYYYMMDDals stringbasierte Eingabe für Konvertierungen reduziert Fehlinterpretationen in unterschiedlichen Umgebungen.
Wer sich dieser Herausforderungen bewusst ist und Best Practices umsetzt, kann SQL-Datumswerte effizienter und fehlerfreier verwalten. Eine gut geplante Handhabung von Datum und Zeit sorgt für konsistente und wartungsfreundliche Datenbankanwendungen.
AUTOR
Björn Peters
Björn arbeitet als Senior Consultant mit Schwerpunkt Microsoft Data Platform, SQL Server, PowerShell und Azure SQL. Er unterstützt Kunden bei Betrieb, Migration, Hochverfügbarkeit, Performance-Analyse und Troubleshooting.
Auf SQL aus Hamburg teilt er Erfahrungen aus realen Projekten – praxisnah, technisch und mit Blick auf stabile, nachvollziehbare Lösungen. Neben SQL Server interessiert er sich für Science-Fiction, Backen und Radfahren.
