在 SQL 服务器中生成周末日期
Generating weekending dates in SQL Server
我在 Microsoft SQL Server Management Studio 工作。我想为不同的 ID 及其不同的时间范围生成所有周末日期(星期六)。
我的数据是这样的:
ID minDate MaxDate
-------------------------
101 5/16/2020 9/25/2021
102 8/7/2021 8/21/2021
103 5/1/2021 9/26/2021
对于 ID = 101
,我想 return 从 5/16/2020、5/23/2020、5/30/2020、6 开始的所有一周结束日期(星期六) /6/2020 ..... 一直到 9/25/2021.
我需要对所有不同的 ID 执行相同的操作。
提前致谢!
..fiddle..
select *, dateadd(week, nm.rn-1, dateadd(day, 7-datepart(weekday, dateadd(day, @@datefirst,mindate)), mindate)) as _Saturday
from
(
values
(101, cast('20200516' as date), cast('20210925' as date)),
(102, '20210708', '20210822'),
(103, '20210501', '20210926')
) as t(id,mindate,maxdate)
join
(
--tally..max 1000 weeks
select row_number() over(order by @@spid) as rn
from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as a(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as b(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as c(n)
) as nm on nm.rn <= datediff(week, mindate, maxdate)+1
where t.maxdate >= dateadd(week, nm.rn-1, dateadd(day, 7-datepart(weekday, dateadd(day, @@datefirst,mindate)), mindate))
order by t.id, nm.rn;
我在 Microsoft SQL Server Management Studio 工作。我想为不同的 ID 及其不同的时间范围生成所有周末日期(星期六)。
我的数据是这样的:
ID minDate MaxDate
-------------------------
101 5/16/2020 9/25/2021
102 8/7/2021 8/21/2021
103 5/1/2021 9/26/2021
对于 ID = 101
,我想 return 从 5/16/2020、5/23/2020、5/30/2020、6 开始的所有一周结束日期(星期六) /6/2020 ..... 一直到 9/25/2021.
我需要对所有不同的 ID 执行相同的操作。
提前致谢!
..fiddle..
select *, dateadd(week, nm.rn-1, dateadd(day, 7-datepart(weekday, dateadd(day, @@datefirst,mindate)), mindate)) as _Saturday
from
(
values
(101, cast('20200516' as date), cast('20210925' as date)),
(102, '20210708', '20210822'),
(103, '20210501', '20210926')
) as t(id,mindate,maxdate)
join
(
--tally..max 1000 weeks
select row_number() over(order by @@spid) as rn
from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as a(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as b(n)
cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as c(n)
) as nm on nm.rn <= datediff(week, mindate, maxdate)+1
where t.maxdate >= dateadd(week, nm.rn-1, dateadd(day, 7-datepart(weekday, dateadd(day, @@datefirst,mindate)), mindate))
order by t.id, nm.rn;