sql >> Databasteknik >  >> RDS >> Sqlserver

Får du veckonummer av ett datum i MS SQL Server 2005?

Tänk på att det finns skillnader i vad som anses vara rätt veckonummer, beroende på kultur. Veckonummer beror på ett par antaganden som skiljer sig från land till land, se Wikipedia-artikel om saken. Det finns en ISO-standard (ISO 8601) som gäller för veckonummer.

SQL-servern integrerade DATEPART() funktion gör inte nödvändigtvis det rätta. SQL Server antar att dag 1 i vecka 1 är 1 januari, för många applikationer är det fel.

Att beräkna veckonummer korrekt är inte trivialt, och olika implementeringar kan hittas på webben. Till exempel finns det en UDF som beräknar ISO-veckotalen från 1930-2030, vilket är en bland många andra. Du måste kontrollera vad som fungerar för dig.

Den här är från Books Online (även om du förmodligen vill använda den från Jonas Lincolns svar, BOL-versionen verkar vara felaktig):

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


  1. Guide för CTE i SQL Server

  2. Hur man konsekvent tjänar en Microsoft Access MVP Award

  3. Höjer ribban för MySQL, MariaDB, PostgreSQL &MongoDB Management

  4. Hur infogar jag en byte[] i en SQL Server VARBINARY-kolumn