我有一张这样的表:
Id | From | To
---+------------+------------
1 | 2018-01-28 | 2018-02-01
2 | 2018-02-10 | 2018-02-12
3 | 2018-02-27 | 2018-03-01
如何在From
和To
日期之间获取所有日期?
FromDate
----------
2018-01-28
2018-01-29
2018-01-30
2018-01-31
2018-02-01
2018-02-10
2018-02-11
2018-02-12
2018-02-27
2018-02-28
2018-02-01
答案 0 :(得分:5)
生成包含所有日期的日历表,例如2018,然后将该表连接到当前表:
DECLARE @todate datetime, @fromdate datetime
SELECT @fromdate='2018-01-01', @todate='2018-12-31'
;WITH calendar (FromDate) AS (
SELECT @fromdate AS FromDate
UNION ALL
SELECT DATEADD(day, 1, FromDate)
FROM Calendar
WHERE FromDate < @todate
)
SELECT t1.FromDate
FROM calendar t1
INNER JOIN yourTable t2
ON t1.FromDate BETWEEN t2.[From] AND t2.[To];
答案 1 :(得分:2)
如果您没有那么多日期,递归CTE是一种非常简单的方法:
with cte as (
select id, fromdate as dte, fromdate, todate
from t
union all
select id, dateadd(day, 1, dte), fromdate, todate
from cte
where dte < todate
)
select id, dte
from cte;
递归CTE具有默认的&#34;深度&#34;这意味着它将适用于长达100个日期的长度(对于每个id)。您可以使用MAXRECURSION
选项覆盖此内容。
使用某种数字表来执行此操作通常会稍微高效一些。然而,递归CTE对于这种计算而言是惊人的有效的。这是开始学习它们的好方法。