我正在寻找一个SQL查询,该查询将为我提供周致命的列表和该特定周的星期一日期。

例如:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

以下简称生产一周

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
有帮助吗?

解决方案

如果您没有数字表,则可以使用系统表即时生成顺序数字列表:

例如

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;

SQL小提琴上的示例

亚伦·伯特兰(Aaron Bertrand) 进行了一些深入的比较,以生成数字的顺序列表的方式:

当然,最简单的方法是创建一个 日历表

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top