Неправильное недельное число с помощью DATEPART в SQL Server

У меня есть проблема это

select datepart(ww, '20100208')

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

Что я должен сделать для получения недельных числовых значений согласно ISO 8601?

8
задан MicSim 8 February 2010 в 14:28
поделиться

1 ответ

Вы можете очень легко сделать это в 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
12
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: