Неправильный номер недели при использовании DATEPART в SQL Server - PullRequest
8 голосов
/ 08 февраля 2010

У меня проблема в том, что

select datepart(ww, '20100208')

возвращается как результат неделя 7 в SQL Server 2000. Но 08.02.2010 должно быть неделя 6 согласно спецификации ISO 8601 ! Это вызывает проблемы в расчетах недели доставки.

Что я должен сделать, чтобы получить значения номера недели в соответствии с ISO 8601?

Ответы [ 2 ]

12 голосов
/ 08 февраля 2010

Вы можете сделать это в SQL 2008 очень легко, поскольку теперь он поддерживает isoww в качестве первого аргумента datepart. Однако этого не было в SQL 2000 (или 2005). В этой статье есть функция, которая сделает это за вас в SQL 2000/2005.

В случае, если блог переходит в автономный режим, вот функция. Перейдите к сообщению, чтобы узнать больше о неделях ISO и не-ISO.

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
0 голосов
/ 14 ноября 2017

Один простой способ сделать это - использовать isowk вместо wk, как показано здесь:

select datepart(isowk, '2010-02-08');

Как уже упоминалось @MicSim и @AdaTheDev, это будет работать только в более новых версиях (> = 2008).

...