sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera ISO-veckonummer från ett datum i SQL Server (T-SQL)

Om du behöver extrahera ISO-veckans nummer från ett datum i SQL Server kan du använda iso_week argument vid anrop av DATEPART() fungera. Du kan alternativt använda isowk eller isoww argument för att göra samma sak.

Med "ISO-vecka" syftar jag på ISO 8601-standarden för datum och tid.

ISO-veckorna börjar på måndagar och den första veckan på ett år innehåller den 4 januari samma år. Därför är det möjligt att datum i början av januari är en del av den 52:a eller 53:e veckan föregående år, och att datum i slutet av december är en del av den första veckan nästa år.

Det betyder att när du extraherar veckonumret från ett datum kan du få olika resultat beroende på om du använder den gregorianska kalendern eller ISO 8601-datum- och tidsstandarden.

Exempel

DECLARE @date date = '2021-01-01';
SELECT DATEPART(iso_week, @date);

Resultat:

53

I det här fallet är datumet 1 januari 2021, men i ISO-termer är det den 53:e veckan 2020.

Jämförelse med gregoriansk

Här är ett annat exempel för att jämföra det med den gregorianska veckan.

DECLARE @date date = '2021-01-01';
SELECT 
  DATEPART(week, @date) AS week,
  DATEPART(iso_week, @date) AS iso_week;

Resultat:

+--------+------------+
 | week   | iso_week   |
 |--------+------------|
 | 1      | 53         |
 +--------+------------+ 

Så vi kan se att samma datum kan ha ett annat veckonummer beroende på om vi använder den gregorianska kalendern eller ISO-standarden.

Vi kan göra samma sak med ett datum nära slutet av föregående år.

DECLARE @date date = '2020-12-27';
SELECT 
  DATEPART(week, @date) AS week,
  DATEPART(iso_week, @date) AS iso_week;

Resultat:

+--------+------------+
 | week   | iso_week   |
 |--------+------------|
 | 53     | 52         |
 +--------+------------+ 

Alternativa argument

Som nämnt, kan alternativt använda isowk eller isoww för att returnera ISO-veckans nummer.

DECLARE @date date = '2021-01-01';
SELECT 
    DATEPART(iso_week, @date) AS iso_week,
    DATEPART(isowk, @date) AS isowk,
    DATEPART(isoww, @date) AS isoww;

Resultat:

+------------+---------+---------+
 | iso_week   | isowk   | isoww   |
 |------------+---------+---------|
 | 53         | 53      | 53      |
 +------------+---------+---------+ 

  1. Hur använder man Array/Table Parameter till Oracle (ODP.NET 10g) via ADO.NET/C#?

  2. Hur visar man funktionen, proceduren, utlöser källkoden i postgresql?

  3. Prestandagränser för logiska replikeringslösningar

  4. Hur man infogar en array i en enda MySQL Prepared statement med PHP och PDO