Curabis

DAX – forkert ugenummer

 

En lidt udfordrende opgave - som jeg selv slet ikke var klar over - er computerens nummerering af uger. Det viser sig, at der godt kan være en uges forskel på, hvad kalenderen viser, og hvad computeren viser. Det kan godt forvirre i for eksempel en produktionsvirksomhed. 

Den grundlæggende forskel er, at ISO-8601 standarden definerer, at ugen begynder på en mandag, samt at årets første uge er den første uge i året, som indeholder en tirsdag.

I DAX er beregningen noget mere enkel, men desværre ofte forkert. DAX kan godt returnere en værdi »Uge 54«, hvilket jo ikke er muligt i virkeligheden, da året så skulle have minimum 372 eller flere dage. DAX funktionen WEEKNUM(’31-12-2012’;2)returnerer fx 54. WEEKNUM tager to parametre. Det første er datoen, det næste en konstant. Konstanten angives til 1, hvis man ønsker, at ugen skal begynde med søndag, og 2 for de lande, hvor ugen begynder med mandag.

DAX WEEKNO

For at komme lidt længere ind i beregningen, så var den 31.12.2012 en mandag. Den 1.1.2013 var altså en tirsdag, hvilket jf. ISO betyder, at ugen skal tælles som uge 1. Men hvordan kommer man så frem til beregningen af den korrekte uge?

 

DAX funktionen WEEKNUM (Dato;Beregningstype) mangler dokumentation fra Microsoft. Dato: Giver sig selv. Her skal der skrives den dato, som ugenummeret skal returneres til. Beregningstype: 1 betyder, at ugen begynder med en søndag, 2, at ugen begynder med en mandag. Så langt Microsofts dokumentation. Skriver du derimod 21 i Beregningstype, vil du modtage korrekte ISO ugenumre. Min tidligere blog om datotabellen i DAX skal dermed udvides med feltet ”ISO uge". Jeg har udvidet udtrykket til følgende: 

 

Dato = ADDCOLUMN( CALENDAR (DATE(YEAR(TODAY())-1;1;1);
    DATE(YEAR(TODAY())+1;12;31));
    "År"; YEAR ( [Dato] );
    "Måned"; MONTH( [Dato]) ;
    "Kvartal" ; INT(FORMAT([Dato]; "q"))
    ”Ugedag” ; WEEKDAY([Dato];2)
    "ISO uge"; WEEKNO([Dato];21))

Drop en besked