2017-05-22 101 views
1

我知道有類似的問題,但沒有找到針對此特定情況的答案。假設我在表格下面的日期範圍(按日期排序):如何確定在SQL Server中有重疊的連續日期記錄

StartDate - EndDate  DoW 
---------------------------------- 
2017-01-10 - 2017-01-15 1 
2017-01-16 - 2017-01-19 2 
2017-01-17 - 2017-01-19 3 
2017-01-18 - 2017-01-21 4 
2017-01-22 - 2017-01-28 5 

預期的結果是TRUE。這組包含連續的最新記錄(之間沒有間隙)具有交疊

StartDate - EndDate  DoW 
---------------------------------- 
2017-01-10 - 2017-01-15 1 
2017-01-16 - 2017-01-19 2 
2017-01-20 - 2017-01-23 3 
2017-01-24 - 2017-01-26 4 
2017-01-27 - 2017-01-28 5 

預期的結果是TRUE。這組包含連續的最新記錄(無重疊)

而這種場合:

StartDate - EndDate  DoW 
--------------------------------- 
2017-01-10 - 2017-01-15 1 
2017-01-17 - 2017-01-19 2 
2017-01-17 - 2017-01-19 3 
2017-01-18 - 2017-01-21 4 
2017-01-22 - 2017-01-28 5 

結果應該是FALSE因爲第一和第二行之間的差距(2017年1月16日是失蹤)。

在此先感謝。

回答

3

如果有差距,它將在結束日期前一天或開始日期後一天。你可以得到這個日期列表並檢查差距。這很棘手,因爲你不想要這些日期的第一個和最後一個。 。 。但是,你可以設置2門限:

with d as (
     select dateadd(day, -1, startdate) as dte 
     from t 
     union all -- do not remove duplicates! 
     select dateadd(day, + 1, enddate) as dte 
     from t 
    ) 
select (case when count(*) > 2 then 'false' else 'true' end) 
from d 
where not exists (select 1 
        from t 
        where d.dte >= t.startdate and 
         d.dte <= t.enddate 
       ); 
0

如果訂單是在你的樣本數據,你可以試試這個,它採用LAG()函數:

CREATE TABLE TT1 (STARTDATE DATE, ENDDATE DATE, DOW INT); 

1)

INSERT INTO TT1 VALUES ('2017-01-10','2017-01-15', 1); 
INSERT INTO TT1 VALUES ('2017-01-16','2017-01-19', 2); 
INSERT INTO TT1 VALUES ('2017-01-17','2017-01-19', 3); 
INSERT INTO TT1 VALUES ('2017-01-18','2017-01-21', 4); 
INSERT INTO TT1 VALUES ('2017-01-22','2017-01-28', 5); 


SELECT MIN(CHCK) AS CHK 
FROM (
     SELECT CASE WHEN DATEDIFF(dd, LAG(ENDDATE) OVER (ORDER BY DOW), STARTDATE) >1 THEN 0 ELSE 1 END AS CHCK 
     FROM TT1 
     ) A; 

DELETE FROM TT1; 

輸出1:

+-----+ 
| CHK | 
+-----+ 
| 1 | 
+-----+ 

2)

INSERT INTO TT1 VALUES ('2017-01-10','2017-01-15', 1); 
INSERT INTO TT1 VALUES ('2017-01-16','2017-01-19', 2); 
INSERT INTO TT1 VALUES ('2017-01-20','2017-01-23', 3); 
INSERT INTO TT1 VALUES ('2017-01-24','2017-01-26', 4); 
INSERT INTO TT1 VALUES ('2017-01-27','2017-01-28', 5); 

SELECT MIN(CHCK) AS CHK 
FROM (
     SELECT CASE WHEN DATEDIFF(dd, LAG(ENDDATE) OVER (ORDER BY DOW), STARTDATE) >1 THEN 0 ELSE 1 END AS CHCK 
     FROM TT1 
     ) A; 

DELETE FROM TT1; 

輸出2:

+-----+ 
| CHK | 
+-----+ 
| 1 | 
+-----+ 

3)

INSERT INTO TT1 VALUES ('2017-01-10','2017-01-15', 1); 
INSERT INTO TT1 VALUES ('2017-01-17','2017-01-19', 2); 
INSERT INTO TT1 VALUES ('2017-01-17','2017-01-19', 3); 
INSERT INTO TT1 VALUES ('2017-01-18','2017-01-21', 4); 
INSERT INTO TT1 VALUES ('2017-01-22','2017-01-28', 5); 

SELECT MIN(CHCK) AS CHK 
FROM (
     SELECT CASE WHEN DATEDIFF(dd, LAG(ENDDATE) OVER (ORDER BY DOW), STARTDATE) >1 THEN 0 ELSE 1 END AS CHCK 
     FROM TT1 
     ) A; 

輸出3:

+-----+ 
| CHK | 
+-----+ 
| 0 | 
+-----+ 
0

你可以嘗試只通過它們的順序連接範圍和最後一天比較第一範圍的第一天和第二範圍的第一天

SELECT iif(count(*)>0, 0, 1) as result 
FROM t prev 
left outer join t next on (prev.Dow+1) = next.Dow 
where 
DATEADD(d, 1, prev.EndDate) < next.StartDate 
0

您可以使用鉛如下得到這個:

select case when count(*) = sum(nextdt) then 'true' else 'false' end as Result 
from (
    select *, NextDt = case when dateadd(dd, 1, enddate) = lead(startdate, 1, dateadd(dd, 1, enddate)) over(order by startdate) then 1 else 0 end from #yourconsequentdate 
) a