在一个表中生成两个日期之间的所有日期。

3

SQL Server 2014

我需要从一个名为 #data 的表中生成起始日期和结束日期之间的所有日期。#data 表包含多行记录,每行记录都有一个起始日期和一个结束日期。

CREATE TABLE #data  (
    StartDate DATE NOT NULL,
    EndDate DATE NOT NULL,
    Opt INT NOT NULL)

insert into #data values('2016-04-10', '2016-04-12', 2)
insert into #data values('2016-04-10', '2016-04-15', 3)
insert into #data values('2016-05-10', '2016-05-12', 4)

表格 #data 可能包含数百行数据。

我的最终选择应包含:

2016-04-10 2
2016-04-11 2
2016-04-12 2
2016-04-10 3
2016-04-11 3
2016-04-12 3
2016-04-13 3
2016-04-14 3
2016-04-15 3
2016-05-10 4
2016-05-11 4
2016-05-12 4

我当前有这个,但是我需要扩展选择#data中所有行:

DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME

SET @StartDateTime = '2015-01-01'
SET @EndDateTime = '2015-01-12';

--delete from #tmp

;WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date
    UNION ALL
    SELECT DATEADD(d,1,DateData)
    FROM DateRange 
    WHERE DateData < @EndDateTime
)
INSERT INTO #tmp SELECT DateData, 1 -- instead of 1 shall be Opt
FROM DateRange
OPTION (MAXRECURSION 0)

select * from #tmp

谢谢。
2个回答

4
也许这就是你想要的?
;WITH DateRange(DateData, EndDate, Opt) AS 
(
    SELECT StartDate, EndDate , Opt FROM #data
    UNION ALL
    SELECT DATEADD(d,1,DateData), EndDate, Opt
    FROM DateRange 
    WHERE DateData < EndDate
)
SELECT DateData, Opt
FROM DateRange
ORDER BY opt, DateData
OPTION (MAXRECURSION 0)

我会考虑生成一个适当的日历表。如果您有一个,就可以通过与日历表联接来更高效地实现所需结果。
参见以下文章以获取示例和更多信息:

http://www.sqlservercentral.com/blogs/dwainsql/2014/03/30/calendar-tables-in-t-sql/

https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/


这个查询是一个经常执行且时间关键的更大查询的一部分。我没有一个日历表,您认为在这种情况下我应该有一个吗?日历表应该是一个普通/静态表吗?谢谢。 - Mihai Hangiu
如果您经常执行此类查询并/或使用大型数据集,则肯定是的。我链接的文章详细解释了概念和用例。它基本上是一个包含日期和与日期相关信息的静态表格。 - jpw

0

试试这个

;WITH DateRange
AS 
(
    SELECT Startdate, Enddate, Opt from #data 
    UNION ALL
    SELECT DATEADD(d,1,Startdate), Enddate, Opt
    FROM DateRange 
    WHERE Startdate < Enddate
)
SELECT Startdate, Opt
FROM DateRange
Order by Opt

结果

Startdate   Opt
---------------
2016-04-10  2
2016-04-11  2
2016-04-12  2
2016-04-10  3
2016-04-11  3
2016-04-12  3
2016-04-13  3
2016-04-14  3
2016-04-15  3
2016-05-10  4
2016-05-11  4
2016-05-12  4

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