Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wochennummer von einem Datum in MS SQL Server 2005 erhalten?

Beachten Sie, dass es je nach Kultur Unterschiede in der korrekten Wochennummer gibt. Wochenzahlen hängen von einigen Annahmen ab, die sich von Land zu Land unterscheiden, siehe Wikipedia-Artikel zu diesem Thema. Es gibt einen ISO-Standard (ISO 8601), der für Wochennummern gilt.

Der SQL-Server hat DATEPART() integriert Funktion tut nicht unbedingt das Richtige. SQL Server geht davon aus, dass Tag 1 von Woche 1 der 1. Januar wäre, für viele Anwendungen ist das falsch.

Die korrekte Berechnung der Wochenzahlen ist nicht trivial, und verschiedene Implementierungen sind im Internet zu finden. Beispielsweise gibt es eine UDF, die die ISO-Wochenzahlen von 1930 bis 2030 berechnet, eine unter vielen anderen. Sie müssen prüfen, was für Sie funktioniert.

Dieser stammt aus Books Online (obwohl Sie wahrscheinlich den aus Jonas Lincolns Antwort verwenden möchten, scheint die BOL-Version falsch zu sein):

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