Имейте в виду, что существуют различия в том, что считается правильным номером недели, в зависимости от культуры. Числа недели зависят от пары предположений, которые отличаются от страны к стране, см. статью Википедии по этому вопросу . Существует стандарт ISO (ISO 8601), который применяется к номерам недели.
Встроенная в SQL-сервер функция DATEPART()
не обязательно выполняет правильные задачи. SQL Server предполагает, что 1-й день 1-й недели будет 1 января, для многих приложений это неправильно.
Правильный расчет номеров недель нетривиален, и в Интернете можно найти различные реализации. Например, есть UDF, который вычисляет номера недель ISO с 1930-2030 , являясь одним из многих других. Вам придется проверить, что работает для вас.
Это из Books Online (хотя вы, вероятно, захотите использовать тот из ответа Джонаса Линкольна , версия BOL, похоже, неверна):
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