数字テーブルがない場合は、システムテーブルを使用して、その場でシーケンシャル番号のリストを生成できます。
例えば
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;
アーロン・バートランド 数字のシーケンシャルリストを生成する方法を深く比較しました。
もちろん、これを行う最も簡単な方法は、 カレンダーテーブル