Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir le numéro de semaine d'une date dans MS SQL Server 2005 ?

Sachez qu'il existe des différences dans ce qui est considéré comme le bon numéro de semaine, selon la culture. Les numéros de semaine dépendent de quelques hypothèses qui diffèrent d'un pays à l'autre, voir l'article de Wikipedia à ce sujet. Il existe une norme ISO (ISO 8601) qui s'applique aux numéros de semaine.

Le serveur SQL intégré DATEPART() fonction ne fait pas nécessairement la bonne chose. SQL Server suppose que le jour 1 de la semaine 1 serait le 1er janvier, ce qui est faux pour de nombreuses applications.

Le calcul correct des numéros de semaine n'est pas trivial et différentes implémentations peuvent être trouvées sur le Web. Par exemple, il y a un UDF qui calcule les numéros de semaine ISO de 1930 à 2030, étant l'un parmi tant d'autres. Vous devrez vérifier ce qui fonctionne pour vous.

Celui-ci provient de Books Online (bien que vous souhaitiez probablement utiliser celui de la réponse de Jonas Lincoln, la version BOL semble être incorrecte) :

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