获取全年每周日期范围的周数

Fetch week numbers with date range of each week for a whole year

使用 SQL 服务器,我需要按周数获取全年的每个星期的日期范围。一周的第一天需要是星期一,除非一周从另一年开始,那么我需要它从一年的第一天开始。

例如,

如果我以 2021 年作为参数调用 select,我希望输出是这样的:

WeekNumbers:      DateStart:        DateEnd:
1                 2021-01-01        2021-01-03
2                 2021-01-04        2021-01-10
...
...
52                2021-12-20        2021-12-26
53                2021-12-27        2021-12-31

请注意示例年份的第一个和最后一个星期数。

谢谢

有很多方法可以解决这个问题。蛮力方法使用某种方法生成所有日期——这使用递归 CTE——然后根据计算星期一的 window 函数分配周数。

with cte as (
      select datefromparts(2021, 1, 1) as dte
      union all
      select dateadd(day, 1, dte)
      from cte
      where dte < datefromparts(2021, 12, 31)
     )
select weeknum, min(dte), max(dte)
from (select cte.*,
             sum(case when datename(weekday, dte) = 'Monday' then 1 else 0 end) over (order by dte) as weeknum
      from cte
     ) cte
group by weeknum
option (maxrecursion 0);

这对于一次性查询来说很好,但不是生成周数的最有效方法。然而,这是递归 CTE 的一个有趣示例。也就是说,您可能真的应该有一个日历 table 将此信息 封装为 table.