Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Retornar o número da semana ISO de uma data no SQL Server (T-SQL)


Se você precisar extrair o número da semana ISO de uma data no SQL Server, você pode usar o iso_week argumento ao chamar o DATEPART() função. Você também pode usar o isowk ou isoww argumentos para fazer a mesma coisa.

Por “semana ISO”, estou me referindo ao padrão de data e hora ISO 8601.

As semanas ISO começam às segundas-feiras e a primeira semana de um ano contém 4 de janeiro daquele ano. Portanto, é possível que as datas do início de janeiro façam parte da 52ª ou 53ª semana do ano anterior e as datas do final de dezembro façam parte da primeira semana do ano seguinte.

Isso significa que, ao extrair o número da semana de uma data, você pode obter resultados diferentes, dependendo se estiver usando o calendário gregoriano ou o padrão de data e hora ISO 8601.

Exemplo

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

Resultado:
53

Nesse caso, a data é 1º de janeiro de 2021, mas em termos ISO, é a 53ª semana de 2020.

Comparação com gregoriano


Aqui está outro exemplo para compará-lo com a semana Gregoriana.
DECLARE @date date = '2021-01-01';
SELECT 
  DATEPART(week, @date) AS week,
  DATEPART(iso_week, @date) AS iso_week;

Resultado:
+--------+------------+
 | week   | iso_week   |
 |--------+------------|
 | 1      | 53         |
 +--------+------------+ 

Assim, podemos ver que a mesma data pode ter um número de semana diferente, dependendo se estamos usando o calendário gregoriano ou o padrão ISO.

Podemos fazer a mesma coisa com uma data próxima ao final do ano anterior.
DECLARE @date date = '2020-12-27';
SELECT 
  DATEPART(week, @date) AS week,
  DATEPART(iso_week, @date) AS iso_week;

Resultado:
+--------+------------+
 | week   | iso_week   |
 |--------+------------|
 | 53     | 52         |
 +--------+------------+ 

Argumentos alternativos


Como mencionado, pode alternativamente usar o isowk ou isoww para retornar o número da semana ISO.
DECLARE @date date = '2021-01-01';
SELECT 
    DATEPART(iso_week, @date) AS iso_week,
    DATEPART(isowk, @date) AS isowk,
    DATEPART(isoww, @date) AS isoww;

Resultado:
+------------+---------+---------+
 | iso_week   | isowk   | isoww   |
 |------------+---------+---------|
 | 53         | 53      | 53      |
 +------------+---------+---------+