Deprecated: Function get_magic_quotes_gpc() is deprecated in /home/homaneeg/public_html/textpattern/lib/constants.php on line 136
General error Warning: Cannot modify header information - headers already sent by (output started at /home/homaneeg/public_html/textpattern/lib/constants.php:136) on line 4706
General error Warning: Cannot modify header information - headers already sent by (output started at /home/homaneeg/public_html/textpattern/lib/constants.php:136) on line 5264
SQL - Berekening datum van de eerste dag van de week (ISO 8601) | homan.ee

SQL - Berekening datum van de eerste dag van de week (ISO 8601)

Posted © 2017 - 2026 Erwin Homan

Berekeningen met datum-waarden in selecties op de database zijn lastig. Voor aggregatie naar weeknummers, waren we op zoek naar een manier om de datum van de eerste dag van de week te berekenen, uitgaande van een willekeurige datum en op basis van ISO 8601 weeknummers.

In SAP HANA is een aantal handige standaardfuncties beschikbaar: ISOWEEK, WEEKDAY, ADD_DAYS. Functie ISOWEEK berekent het ISO weeknummer voor een opgegeven datum. WEEKDAY berekent een integer die hoort bij de dag van de week voor een opgegeven datum: 0 voor maandag, 6 voor zondag. Dit past bij de regels van ISO 8601 die zeggen dat maandag de eerste dag van de week is.

Een SELECT-statement dat de datum van de eerste dag van de week berekent voor een willekeurige datum:
SELECT null AS DateFirst, TO_DATE('2017-01-01', 'YYYY-MM-DD') AS Date, ISOWEEK(TO_DATE('2017-01-01', 'YYYY-MM-DD')) AS IsoWeek, ADD_DAYS(TO_DATE('2017-01-01', 'YYYY-MM-DD'), 0 - WEEKDAY ( TO_DATE('2017-01-01', 'YYYY-MM-DD'))) AS IsoWeekFirstDay FROM DUMMY;

Microsoft SQL Server heeft vergelijkbare, handige standaardfuncties: CAST, DATEPART, WEEKDAY. De DATEPART-functie is veelzijdig en kan ook worden gebruikt om het ISO 8601 weeknummer te berekenen voor een gegeven datum.

Sommige features van SQL Server zorgen voor complicaties. De WEEKDAY-functie berekent een integer tussen 1 en 7 voor een opgegeven datum: de dag van de week. Welke dag dat is hangt af van de waarde van een omgevingsvariabele DATEFIRST. Dit gaat veel verder dan ISO 8601, maar we hebben toch de kennis nodig om de datum van de eerste dag van de ISO week te kunnen berekenen:
SELECT @@DATEFIRST AS DateFirst, '2017-01-01' AS Date, DATEPART(isowk, '2017-01-01') AS IsoWeek, CAST(CAST('2017-01-01' AS datetime) - DATEPART(WEEKDAY, CAST('2017-01-01' as datetime) + @@DATEFIRST + 5 ) % 7 AS date) AS IsoWeekFirstDay;

Author
Categories ,