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;
Aaron Bertrand fez algumas maneiras de comparações detalhadas de gerar listas seqüenciais de números:
- Gerar um conjunto ou sequência sem loops - Parte 1
- Gerar um conjunto ou sequência sem loops - parte 2
- Gerar um conjunto ou sequência sem loops - Parte 3
Claro que a maneira mais fácil de fazer isso seria criar um Tabela de calendário