我从一个被问到的 StackOverflow 问题中得到了这个例子,但我无法根据我的需要让它工作。
WITH DateTable
AS
(
SELECT CAST('20110101' as Date) AS [DATE]
UNION ALL
SELECT DATEADD(dd, 1, [DATE]) FROM DateTable
WHERE DATEADD(dd, 1, [DATE]) < cast('20110131' as Date)
)
SELECT dt.[DATE] FROM [DateTable] dt
输入-
ID | FromDate | ToDate
=============================
1 | 2011-11-10 | 2011-11-12
2 | 2011-12-12 | 2011-12-14
输出 -
SN | Dates |
==================
1 | 2011-11-10 |
2 | 2011-11-11 |
3 | 2011-11-12 |
4 | 2011-12-12 |
5 | 2011-12-13 |
6 | 2011-12-14 |
查看此代码适用于静态日期。但就我而言,我有一个包含三列 Id、FromDate、ToDate
的表。现在我想将每一行中的每个范围转换为单独的日期。
如果范围来自表,并且显然必须为范围表中的每一行运行此查询,我无法让上面的示例工作,这是另一个令人困惑的挑战。
请帮忙。
最佳答案
在数字表的帮助下。
declare @T table
(
ID int identity primary key,
FromDate date,
ToDate date
)
insert into @T values
('2011-11-10', '2011-11-12'),
('2011-12-12', '2011-12-14')
select row_number() over(order by D.Dates) as SN,
D.Dates
from @T as T
inner join master..spt_values as N
on N.number between 0 and datediff(day, T.FromDate, T.ToDate)
cross apply (select dateadd(day, N.number, T.FromDate)) as D(Dates)
where N.type ='P'
试穿SE Data
关于sql - 在 SQL Server 中获取日期范围内的所有日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140308/