MS SQL – številka tedna (week number)

Sql
V službi sem pri nekem projektu potreboval podatek za poljuben datum, da mi pove kateri teden je takrat. Ker gre za projekt pri katerem se planirajo potrebe v proizvodnji in ker je naša matična firma v nemčiji se vsi roki in planirani datumi govorijo v številkah tedna. Toda kako to številko dobiti direktno iz funkcij v MS SQL-u?

Ko sem pogledal v MS SQL books online sem našel čisto preprosto sintakso:

DATEPART (wk, ‘2010-04-12’)

Vendar tukaj dobim napačno številko. Problem je v tem, da se predvsem v evropi uporablja štetje tednov drugače. Sql vzame kot prvi teden dneve, ki so še v zadnjem tednu prejšnjega leta. Po evopskem (ISO) načinu, pa se šteje za prvi teden šele prvi ponedeljek. Primer: 1.1.2010 je bil petek. In MS SQL šteje ta teden že kot prvi teden, pa čeprav je to tudi v bistvu 53.teden prejšnjega leta. ISO štetje, pa vzame kot prvi dan 1 tedna 4.1.2010 – ponedeljek.

Torej pravilna sintaksa je :

select DATEPART (isowk, ‘2010-04-12’) as weeknumber

Vendar sem ugotovil, da to deluje šele na MS SQL 2008. Torej sem moral za MS SQL 2000 poiskati drugo rešitev. In sem jo našel. Prav tako je posredovana iz strani Microsofta. Pohvalno.

Na sistemski bazi master sem poiskal User Defined functions in dodal sledeče:

CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END

Ko hočemo poklicati to funkcijo uporabimo slednje (primer):

SELECT master.dbo.ISOweek(‘2010-04-14’) AS ‘ISO Week’

Tako pa smo rešili še en problem 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *