获取全年每周日期范围的周数
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.
使用 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.