Należy pamiętać, że istnieją różnice w tym, co jest uważane za prawidłowy numer tygodnia, w zależności od kultury. Numery tygodni zależą od kilku założeń, które różnią się w zależności od kraju, zobacz artykuł w Wikipedii na ten temat. Istnieje norma ISO (ISO 8601), która dotyczy numerów tygodni.
Zintegrowany serwer SQL DATEPART()
funkcja niekoniecznie musi robić właściwą rzecz. SQL Server zakłada, że pierwszym dniem tygodnia 1 będzie 1 stycznia, w przypadku wielu aplikacji jest to błąd.
Prawidłowe obliczenie numerów tygodni nie jest trywialne, a w sieci można znaleźć różne implementacje. Na przykład istnieje UDF, który oblicza numery tygodni ISO z lat 1930-2030, będąc jednym z wielu innych. Musisz sprawdzić, co Ci odpowiada.
Ten pochodzi z Books Online (chociaż prawdopodobnie chcesz użyć tego z odpowiedzi Jonasa Lincolna, wersja BOL wydaje się nieprawidłowa):
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
GO