Kuidas arvutada nädala numbrit SQLis

Sel aastal on taas saanud palju nalja nädalate nummerdamisega. Aasta esimesed kolm päeva läksid nii mõnelgi valearvestusse, kaduma või sassi.

Esmalt meenutaks, kuidas nädalaid nummerdatakse. Maailmas on selleks kuus (jahh 6) erinevat viisi. Arvestan siin ainult neid, kus kasutusel Gregoriuse kalender, ehk see, mida me igapäevaselt kasutame.

Esiteks määrab nädalate nummerdamise nädala algus – osa maid arvavad, et nädal algab pühapäevaga (nn Kristuse elunädal – pühapäev sünd (vrd vene keeles  воскресенье) ja reedel surm, laupäev vaikuse päev). Meie teame, et nädal algab esmaspäevaga (nn maailma loomise nädal – pühapäev on hingamispäev).

Teiseks on nädalate nummerdamisel kolm viisi:

  • esimene nädal on see, kus on 1. jaanuar
  • esimene nädal on esimene terve nädal (vastavalt siis esimesest esmaspäevast või pühapäevast)
  • esimene nädal on, see, kus üle poole on uue aasta päevad. St meil kui aasta alguspäev esmaspäevast neljapäevani, on see ka esimene nädal, kui aasta algab reede, laupäeva või pühapäevaga, siis esimene on esmaspäevaga algav nädal.

Koos nädala alguse erineva tõlgendusega saamegi siit kuus erinevat nädalate numeratsiooni. Paljud ei tea, aga meil (ja mujal euroopas) kehtib just see kolmas nummerdamisviis, ajades asju aga mõne Ameerika või Kanada partneriga ole ettevaatlik – neil ei pruugi see nii olla. Ja just 2010 on taas selline, kus numbrisüsteem meil erineb Ameerika omast.

Kurblugu on aga selles, et suur osa tarkvara on ameerikakesksed, ka need mis eestindatud (lokaliseeritud) on selle koha peal sageli ‘vigased’. Nii ka SQL-põhised andmebaasisüsteemid.

MS SQL pakub funktsiooni DATEPART(weeknum, <kuupäev>) – see aga annab käesoleval aastal vale nädalanumbri.

Hää sõbra palvel tegin lihtsa funktsiooni, mis peaks olema ‘lollikindel’ (päris lollikindlaid asju ei ole, sest lollid on leidlikud) – vähemalt katsetasin nii ja naa, ja ta andis ikka õige tulemuse. Funktsioon ise on järgmine:

alter function dbo.WeekNumber(@d datetime)
returns int
as
begin
    declare @day int
    declare @fst int
    set @day = DATEPART(DAYOFYEAR, @d)
    set @fst = DATEPART(WEEKDAY, cast( (‘1.1.’ + cast(year(@d) as CHAR(4))) as smalldatetime))
    return ((@day + @fst – 3) / 7)
end

Funktsioon annab tagasi kuupäevale vastava nädala numbri. Poolik nädal aasta alguses (enne esimest nädalat) kannab numbrit null (et ei läheks sassi aasta lõpus oleva pooliku nädalaga).

Võid proovida ja teha parema, võid sama valemit kasutada ka ilma funktsiooni tegemata. Mõneks aastaks on nädalanumbri mure murtud.

Head uut nädalat

Henn

This entry was posted in MS SQL Server. Bookmark the permalink.

Kuidas arvutada nädala numbrit SQLis on saanud 2 vastust

  1. Urmas ütles:

    SQL 2008\’st alates on DATEPART\’il selle jaoks olemas argument ISO_WEEK

Lisa kommentaar

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s