Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottenere il numero della settimana da una data in MS SQL Server 2005?

Tieni presente che ci sono differenze in ciò che è considerato il numero della settimana corretto, a seconda della cultura. I numeri delle settimane dipendono da un paio di ipotesi che differiscono da paese a paese, vedere l'articolo di Wikipedia sull'argomento. Esiste uno standard ISO (ISO 8601) che si applica ai numeri delle settimane.

Il server SQL ha integrato DATEPART() la funzione non fa necessariamente la cosa giusta. SQL Server presuppone che il giorno 1 della settimana 1 sia il 1 gennaio, per molte applicazioni è sbagliato.

Calcolare correttamente i numeri delle settimane non è banale e sul web si possono trovare diverse implementazioni. Ad esempio, c'è un UDF che calcola i numeri della settimana ISO dal 1930 al 2030, essendo uno tra molti altri. Dovrai controllare cosa funziona per te.

Questo è di Books Online (anche se probabilmente vuoi usare quello della risposta di Jonas Lincoln, la versione BOL sembra non essere corretta):

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