将日期范围与一组日期范围进行比较SQL

问题描述:

好的,所以这个特殊的用例给了我很多头痛的问题。将日期范围与一组日期范围进行比较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重叠..但我很难理解如何在一组上进行比较。

任何帮助非常感谢!

尝试此查询:

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