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

时间:2014-10-03 08:36:32

标签: sql sql-server database tsql datetime

好的,所以这个特殊的用例让我有点头疼。

我想要做的是弄清楚集合中的任何StartDate和EndDates是否与一组Start和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

工作愿望表

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

CustomerJobQuery表

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

这是我的DateRange表..我的StoredProcedure接受的是CandidateId;我希望找到Candidate Id的WorkWishes,将WorkWish的DateRanges与所有CustomerJobQuery DateRanges匹配,并返回具有重叠日期的CustomerJobQueries。

我想出了如何检查特定的DateRange是否与另一个DateRange重叠...但我对如何在集合上进行此比较感到难过。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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