Fallgropar med veckonummer
På grund av total förvirring kring veckonummer i världen kan jag tipsa om att SQL kan enkelt leverera rätt veckonummer enligt ISO standard (som självklart Sverige redan använder).
Syntaxen är:
DATEPART(iso_week, GETDATE())
Dvs, använd aldrig WEEK(getdate()) - även om det kanske funkar just nu så kan det bara vara en olyckligt sammanträffande och ett annat år så slutar ditt system att fungera efter nyår.
Läs mer om veckor på Wikipedia:
http://sv.wikipedia.org/wiki/Vecka
ISO-standarden säger att en vecka alltid måste börja på en måndag (vilket på något sätt är rimligast) och för att det ska räknas som en vecka måste den ha minst fyra dagar, dvs den första veckan på året blir den första veckan som har sin torsdag på det nya året! Enkelt och självklart. Däremot blir det lite märkligt när nyårsafton infaller just på en torsdag för då går den första veckan av det nya året under numret 53 på föregående år, det är en nödvändig konsekvens av ISO standarden men det betyder alltså att man måste tänka på följande:
- Utgå inte från att veckans år alltid är nuvarande år (du kan alltså inte räkna med att köra WHERE week= DATEPART(ISO_WEEK, getdate()) AND year=year(getdate())
- Räkna inte med att det bara är 52 veckor på ett år
- Testa! (det är svårt att få sitt huvud runt detta och pröva genom att ställa fram klockan några år)
Detta året ger till exempel SQL Servern följande veckonummer för i fredags:
När det korrekta värdet egentligen är:
Jag personligen skulle vara glad om SQL Server var konfigurerad till att alltid ange ISO standarder på alla värden men det kanske går att ställa in?
Christian Landgren
2010-05-17