2014-10-03 204 views
2

好的,所以這個特殊的用例給了我很多頭痛的問題。將日期範圍與一組日期範圍進行比較SQL

我想要做的是找出一組中的任何StartDate和EndDates是否與一組StartDate和EndDates重疊,如果它們是重疊的行必須返回。

DATERANGE表 - 包含所有DateRanges

DateRangeId StartDate     EndDate      CustomerJobQuery_Id WorkWish_Id 
----------- --------------------------- --------------------------- ------------------- ----------- 
1   2014-03-31 00:00:00.0000000 2014-08-18 00:00:00.0000000 NULL    1 
2   2014-08-25 00:00:00.0000000 2014-09-15 00:00:00.0000000 NULL    1 
3   2013-08-24 00:00:00.0000000 2014-09-25 00:00:00.0000000 1     NULL 

Workwish表

Id   Candidate_Id 
----------- ------------ 
1   5 

CustomerJobQuery表

Id   Customer_CustomerId 
----------- ------------------- 
1   2 

這是我的DateRange表..我的StoredProcedure接受的是一個CandidateId;我希望找到Candidate Id的WorkWishes,將WorkWish的DateRanges與所有CustomerJobQuery DateRanges進行匹配,並返回具有重疊日期的CustomerJobQueries。

我想出瞭如何檢查一個特定的DateRange是否與另一個DateRange重疊..但我很難理解如何在一組上進行比較。

任何幫助非常感謝!

回答

2

嘗試此查詢:

SELECT c.* 
    FROM CustomerJobQuery c 
    WHERE EXISTS ( 
    SELECT 1 
    FROM Workwish w 
    INNER JOIN DateRange d1 ON d1.CustomerJobQuery_Id = c.Id 
    INNER JOIN DateRange d2 ON d2.WorkWish_Id = w.Id 
    WHERE w.Candidate_Id = 5 -- CandidateId in procedure 
     -- overlap check: 
     AND d1.StartDate <= d2.EndDate 
     AND d2.StartDate <= d1.EndDate 
) 

測試在這裏(SQL小提琴):http://sqlfiddle.com/#!3/10253/3