Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obtendo o número da semana de uma data no MS SQL Server 2005?


Esteja ciente de que existem diferenças no que é considerado o número de semana correto, dependendo da cultura. Os números das semanas dependem de algumas suposições que diferem de país para país, veja o artigo da Wikipedia sobre o assunto. Existe um padrão ISO (ISO 8601) que se aplica a números de semanas.

O servidor SQL integrou DATEPART() função não necessariamente faz a coisa certa. O SQL Server assume que o dia 1 da semana 1 seria 1º de janeiro, para muitos aplicativos isso está errado.

Calcular os números da semana corretamente não é trivial, e diferentes implementações podem ser encontradas na web. Por exemplo, existe uma UDF que calcula os números das semanas ISO de 1930-2030, sendo uma entre muitas outras. Você terá que verificar o que funciona para você.

Este é do Books Online (embora você provavelmente queira usar o da resposta de Jonas Lincoln, a versão BOL parece estar incorreta):
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