Si no tiene una tabla de números, puede generar una lista de números secuenciales en la marcha usando tablas del sistema:
p.ej
SELECT Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM sys.all_objects;
Si necesita extender esto para más números, puede cruzar las tablas de unión:
SELECT Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
Entonces solo necesita sumar/restar estos números de semanas desde su fecha de inicio:
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 es una forma detallada de hacer esto para una claridad paso a paso, se puede condensar 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 realizado algunas formas de comparación en profundidad de generar listas secuenciales de números:
- Genere un conjunto o secuencia sin bucles - Parte 1
- Genere un conjunto o secuencia sin bucles - Parte 2
- Genere un conjunto o secuencia sin bucles - Parte 3
Por supuesto, la forma más fácil de hacer esto sería crear un mesa de calendario