查找SQL Server不同时间间隔之间的缺少日期范围

时间:2017-07-12 13:55:27

标签: sql-server

- 输入

CREATE TABLE #DATES( StartDate DATETIME, EndDate DATETIME ) 

INSERT INTO #DATES VALUES ( '2014-09-01 00:00:00.000','2015-09-02 23:59:59.000')

INSERT INTO #DATES VALUES ( '2014-01-16 00:00:00.000','2014-04-04 23:59:59.000')

INSERT INTO #DATES VALUES ( '2012-09-04 00:00:00.000','2014-01-15 23:59:59.000')

INSERT INTO #DATES VALUES ( '2011-09-05 00:00:00.000','2012-09-03 23:59:59.000')

输出

|-----------StartDate-----------|-----------EndDate -----------|

| 2014-04-05 00:00:00.000 | 2014-08-31 23:59:59.000 |

也可能存在多个差距,也可以针对单个实体进行分组。

1 个答案:

答案 0 :(得分:0)

我提出了解决方案。对解决方案并不感到自豪。最后,我还需要在日期之间进行重叠检查。但是现在它解决了封锁

SELECT StartFrom.StartDate, B.EndDate FROM 
(SELECT StartDate FROM 
( SELECT DATEADD(SS,-1,StartDate) AS EndDate, DATEADD(SS,1,EndDate) AS StartDate FROM #Dates ) StartMain
WHERE NOT EXISTS ( SELECT * FROM #Dates A WHERE StartMain.StartDate BETWEEN A.StartDate AND A.EndDate )) AS StartFrom,
(SELECT  EndDate FROM 
( SELECT DATEADD(SS,-1,StartDate) AS EndDate, DATEADD(SS,1,EndDate) AS StartDate FROM #Dates ) B
WHERE NOT EXISTS ( SELECT * FROM #Dates A WHERE B.EndDate BETWEEN A.StartDate AND A.EndDate ) )  AS B
WHERE StartFrom.StartDate < B.EndDate

以上查询适用于所询问的问题,以及有关单个实体分组的附加信息。

CREATE TABLE #DATES( ID INT,  StartDate DATETIME, EndDate DATETIME )
INSERT INTO #DATES VALUES (1, '2014-09-01 00:00:00.000','2015-09-02 23:59:59.000' )
INSERT INTO #DATES VALUES (1, '2014-01-16 00:00:00.000','2014-04-04 23:59:59.000' )
INSERT INTO #DATES VALUES (1, '2012-09-04 00:00:00.000','2014-01-15 23:59:59.000' )
INSERT INTO #DATES VALUES (1, '2011-09-05 00:00:00.000','2012-09-03 23:59:59.000' )
INSERT INTO #DATES VALUES (1, '2015-10-01 00:00:00.000','2015-12-31 23:59:59.000' )
INSERT INTO #DATES VALUES (2, '2014-09-01 00:00:00.000','2015-09-02 23:59:59.000' )
INSERT INTO #DATES VALUES (2, '2014-01-16 00:00:00.000','2014-04-04 23:59:59.000' )
INSERT INTO #DATES VALUES (2, '2012-09-04 00:00:00.000','2014-01-15 23:59:59.000' )
INSERT INTO #DATES VALUES (2, '2011-09-05 00:00:00.000','2012-09-03 23:59:59.000' )
INSERT INTO #DATES VALUES (2, '2015-10-01 00:00:00.000','2015-12-31 23:59:59.000' )

SELECT Main.ID, StartFrom.StartDate, EndTo.EndDate
FROM (SELECT DISTINCT ID FROM #DATES ) Main
JOIN (SELECT StartDate, ID FROM 
     ( SELECT DATEADD(SS,-1,StartDate) AS EndDate, DATEADD(SS,1,EndDate) AS StartDate, ID FROM #Dates ) StartMain
     WHERE NOT EXISTS ( SELECT * FROM #Dates A WHERE StartMain.ID = A.ID AND StartMain.StartDate BETWEEN A.StartDate AND A.EndDate )) AS StartFrom
ON Main.ID = StartFrom.ID
JOIN (SELECT  EndDate, ID FROM 
     ( SELECT DATEADD(SS,-1,StartDate) AS EndDate, DATEADD(SS,1,EndDate) AS StartDate, ID FROM #Dates ) EndMain
     WHERE NOT EXISTS ( SELECT * FROM #Dates A WHERE EndMain.ID = A.ID AND EndMain.EndDate BETWEEN A.StartDate AND A.EndDate ) )  AS EndTo
ON Main.ID = EndTo.ID
WHERE StartFrom.StartDate < EndTo.EndDate

希望它有所帮助。如果有人得到更好的优化解决方案,请在此处发布。