选择表中两个日期列之间的所有日期

时间:2018-01-28 12:59:02

标签: sql sql-server

我有一张这样的表:

 Id | From       | To
 ---+------------+------------
 1  | 2018-01-28 | 2018-02-01
 2  | 2018-02-10 | 2018-02-12  
 3  | 2018-02-27 | 2018-03-01

如何在FromTo日期之间获取所有日期?

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

2 个答案:

答案 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];

Demo

答案 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对于这种计算而言是惊人的有效的。这是开始学习它们的好方法。