Se non si dispone di una tabella dei numeri puoi generare un elenco di numeri sequenziali al volo usando le tabelle di sistema:
per esempio
SELECT Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM sys.all_objects;
Se è necessario estenderlo per più numeri, puoi incrociare le tabelle:
SELECT Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
Quindi devi solo aggiungere/sottrarre questo numero di settimane dalla data di inizio:
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;
Questo è un modo verboso di farlo per la chiarezza passo passo, può essere condensato 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 ha fatto alcuni confronti di profondità modi per generare elenchi sequenziali di numeri:
- Generare un set o una sequenza senza loop - Parte 1
- Generare un set o una sequenza senza loop - Parte 2
- Generare un set o una sequenza senza loop - Parte 3
Naturalmente il modo più semplice per farlo sarebbe quello di creare un Tabella del calendario