如果您没有数字表,则可以使用系统表即时生成顺序数字列表:
例如
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;
亚伦·伯特兰(Aaron Bertrand) 进行了一些深入的比较,以生成数字的顺序列表的方式:
当然,最简单的方法是创建一个 日历表