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

Advertisements
Rubriigid: MS SQL Server. Salvesta püsiviide oma järjehoidjasse.

2 Responses to Kuidas arvutada nädala numbrit SQLis

  1. Urmas ütles:

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

Lisa kommentaar

Täida nõutavad väljad või kliki ikoonile, et sisse logida:

WordPress.com Logo

Sa kommenteerid kasutades oma WordPress.com kontot. Logi välja / Muuda )

Twitter picture

Sa kommenteerid kasutades oma Twitter kontot. Logi välja / Muuda )

Facebook photo

Sa kommenteerid kasutades oma Facebook kontot. Logi välja / Muuda )

Google+ photo

Sa kommenteerid kasutades oma Google+ kontot. Logi välja / Muuda )

Connecting to %s