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

3

我有这样的一个表:

Id
1 2018-01-28 2018-02-01
2 2018-02-10 2018-02-12
3 2018-02-27 2018-03-01

如何获得所有在 日期之间的日期?

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

请勿在英文中将每个单词都大写! - marc_s
@marc_s 这感觉有点像德语,或者荷兰语的一种 :-) - Tim Biegeleisen
@TimBiegeleisen:但即使在德语或荷兰语中,你也不会将每个单词都大写!比英语多一些-可以理解-但并非每一个 :-) - marc_s
2个回答

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


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的默认“深度”为100。这意味着它将适用于每个id长达100个日期的跨度。您可以使用MAXRECURSION选项覆盖此设置。

通常使用某种数字表格执行此操作略微更有效。但是,递归CTE对于此类计算效率惊人。这是学习有关它们的好方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接