- 输入
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 |
也可能存在多个差距,也可以针对单个实体进行分组。
答案 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
希望它有所帮助。如果有人得到更好的优化解决方案,请在此处发布。