SQL que lista X registra com o WeekNumber e a data de segunda -feira para cada semana

StackOverflow https://stackoverflow.com/questions/20353802

  •  25-08-2022
  •  | 
  •  

Pergunta

Estou procurando uma consulta SQL que me fornecesse uma lista do WeekNumber e a data de segunda -feira para aquela semana em particular.

Por exemplo:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

Os seguintes atos produzem uma semana

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
Foi útil?

Solução

Se você não tiver uma tabela de números, pode gerar uma lista de números seqüenciais em tempo real usando tabelas do sistema:

por exemplo

SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM    sys.all_objects;

Se você precisar estender isso para mais números, poderá cruzar as tabelas:

SELECT  Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

Então você só precisa adicionar/subtrair o número de semanas da data de início:

DECLARE @Monday DATE = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0);

WITH Numbers AS
(   SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
    FROM    sys.all_objects
)
SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, - n.Number, @Monday)
            FROM    Numbers n
        ) w;

Esta é uma maneira detalhada de fazer isso para clareza passo a passo, pode ser condensado a:

SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - ROW_NUMBER() OVER(ORDER BY object_id), 0)
            FROM    sys.all_objects
        ) w;

Exemplo no violino SQL

Aaron Bertrand fez algumas maneiras de comparações detalhadas de gerar listas seqüenciais de números:

Claro que a maneira mais fácil de fazer isso seria criar um Tabela de calendário

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top