【问题标题】:Fetch week numbers with date range of each week for a whole year获取一周的日期范围为一整年的周数
【发布时间】:2021-08-21 23:47:41
【问题描述】:

使用 SQL Server,我需要按周数获取全年的日期范围。一周的第一天必须是星期一,除非一周从另一年开始,否则我需要它从一年的第一天开始。

例如,

如果我以 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

请注意示例年份的第一周和最后一周的编号。

谢谢

【问题讨论】:

标签: sql sql-server tsql date-range week-number


【解决方案1】:

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

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 的一个有趣的例子。也就是说,您可能真的应该有一个将这些信息封装为表格的某种日历表。

【讨论】:

  • 我只有一个问题,当星期一恰好是一周的第一天,周数从 0 开始,你知道我该如何改变吗?谢谢
  • @MadBrother33 。 . .如果星期一是 的第一天,则周数从 1 开始:dbfiddle.uk/….
  • 是的,我想通了,谢谢你所做的一切:)
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多