【问题标题】:SQL Server : return list real week of startdate and enddateSQL Server:返回列表开始日期和结束日期的真实周
【发布时间】:2021-06-07 03:13:04
【问题描述】:

我遇到了一个难题。如何根据startdateenddate 获得每个真实的周数?

例子:

@startdate datetime = '2021-05-01',
@enddate datetime = '2021-05-31'

预期结果:

|datefrom|   ~   |dateto|
2021-05-01      2021-05-02
2021-05-03      2021-05-09
2021-05-10      2021-05-16
2021-05-17      2021-05-23
2021-05-24      2021-05-30
2021-05-31      2021-05-31

【问题讨论】:

  • DATEPART(weekday, 'yyyy/mm/dd') 会给你一个介于 1(星期日)和 7(星期六)之间的数字。您可以使用它来计算日历周数。

标签: sql sql-server-2016


【解决方案1】:

你需要递归 cte:

declare @startdate date ='2021-05-15',
        @enddate date ='2021-06-15'


;with cte as ( 
Select 
    @startdate weekstart
    , DATEADD(DAY, 8 - DATEPART(WEEKDAY, @startdate), CAST(@startdate AS DATE)) weekend
union all 
select 
    DATEADD(day , 1 , weekend) 
    , case when DATEADD(DAY, 8 - DATEPART(WEEKDAY, DATEADD(day , 1 , weekend)), CAST(DATEADD(day , 1 , weekend) AS DATE))  >= @enddate then @enddate 
    else DATEADD(DAY, 8 - DATEPART(WEEKDAY, DATEADD(day , 1 , weekend)), CAST(DATEADD(day , 1 , weekend) AS DATE)) end weekend
from cte 
where DATEADD(day , 1 , weekend) <= @enddate
)

select * from cte
周开始|周末 :--------- | :--------- 2021-05-01 | 2021-05-02 2021-05-03 | 2021-05-09 2021-05-10 | 2021-05-16 2021-05-17 | 2021-05-23 2021-05-24 | 2021-05-30 2021-05-31 | 2021-05-31

db小提琴here

注意:我使用date 作为日期类型来简化,但是使用 datetime 应该没有问题,只需在查询中将转换为 datetime 即可

【讨论】: