In SQL zijn er veel functies voor het werken met datums en intervallen: DATEDIFF, DATEADD (T-SQL), werken met het type INTERVAL (PostgreSQL), functionaliteit voor tijdsconversie naar verschillende zones (AT TIME ZONE). Voor een correcte werking met datums is het belangrijk om datatypes te gebruiken die rekening houden met de tijdzone (TIMESTAMP WITH TIME ZONE, timestamptz), en niet alleen DATE of DATETIME, vooral voor wereldwijde diensten.
In verschillende DBMS varieert de syntaxis en de werkwijze:
DATEDIFF, DATEADD, FORMAT, maar geen volwaardig INTERVAL. Tijdzones worden expliciet geregeld.Fouten ontstaan vaak door inconsistentie in opslag in UTC/lokale tijd en het mengen van bewerkingen die deze verschillen niet in overweging nemen.
SELECT EXTRACT(EPOCH FROM (event_end AT TIME ZONE 'UTC' - event_start AT TIME ZONE 'UTC')) / 3600 AS hours FROM events
Kan DATEDIFF een negatieve waarde teruggeven, en wat betekent de volgorde van de datums?
Antwoord: Ja, DATEDIFF (DATEDIFF(day, d1, d2)) retourneert een negatief getal als d2 < d1. Het is belangrijk om de volgorde van de parameters niet te verwarren: eerst komt de eenheid van meting, dan de startdatum, en dan de einddatum.
Voorbeeld:
SELECT DATEDIFF(day, '2024-05-01', '2024-04-25') -- geeft -6 terug
Verhaal
In een project met wereldwijde gebruikers werden rapporten opgebouwd volgens de lokale tijd van servers in elke regio. Het resultaat — uit elkaar lopende aggregaten op datums en het ontstaan van "gaten" op de grens van middernacht voor gebruikers uit andere tijdzones. Dit werd opgelost door alle tijdsgegevens naar UTC te converteren en alleen voor weergave opnieuw te berekenen.
Verhaal
Bij het berekenen van de abonnementsduur met DATEDIFF was de volgorde van de datums verwisseld. Hierdoor werden sommige gebruikers ten onrechte als "supergebruikers" erkend met opzettelijk negatieve verjaring. Dit is opgelost door een controle in te voeren voor de volgorde van datums.
Verhaal
Een ontwikkelaar slaat DATETIME op zonder rekening te houden met de tijdzone, tijdens de migratie naar PostgreSQL werden de waarden geïnterpreteerd als UTC, terwijl ze oorspronkelijk in GMT+3 waren, wat leidde tot een verschuiving van gebeurtenissen in rapporten met 3 uur terug. Conclusie — altijd datums opslaan en omzetten met rekening houdend met de zone!