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;