Если у вас нет таблицы номеров, вы можете сгенерировать список последовательных чисел на лету, используя системные таблицы:
например
SELECT Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM sys.all_objects;
Если вам нужно расширить это для получения дополнительных чисел, вы можете пересечь таблицы:
SELECT Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
Тогда вам просто нужно добавить/вычесть это количество недель с даты начала:
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;
Это словесный способ сделать это для пошаговой ясности, он может быть сжат с:
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;
Аарон Бертран сделал некоторые по всему глубину, сравнивая способы создания последовательных списков чисел:
- Создать набор или последовательность без петлей - часть 1
- Создать набор или последовательность без петлей - часть 2
- Создать набор или последовательность без петлей - часть 3
Конечно, самый простой способ сделать это - создать календарный таблица