2011-01-27 427 views
3

我想从表中提取行的间隔与查询中指定的间隔相交的行。假设我有一个简单的ID, DATE_START, DATE_END表和两个查询参数P_DATE_STARTP_DATE_END,表达查询的最简单方法是什么,以便我找到[DATE_START, DATE_END]至少具有一个公共元素[P_DATE_START, P_DATE_END]的所有行?使用SQL查找重叠间隔


更新:

为了使所期望的结果更清楚,请找输入值和预期结果下面的列表。 Colums是DATE_START, DATE_END, P_DATE_START, P_DATE_END, MATCH

16, 17, 15, 18, YES 
15, 18, 16, 17, YES 
15, 17, 16, 18, YES 
16, 18, 15, 17, YES 
16, 17, 18, 19, NO 
18, 19, 16, 17, NO 
+1

http://stackoverflow.com/questions/143552/comparing-date-ranges/143568#143568 – 2011-01-27 13:19:24

+0

@马丁:这似乎正是我要找的,谢谢!如果是的话,我会投票结束我自己的问题。 – 2011-01-27 13:24:02

回答

7

更简单:

SELECT id, date_start, date_end 
FROM thetable 
WHERE date_start <= p_date_end 
AND date_end >= p_date_start 
+0

谢谢,我也试过这个。当[[date_start,date_end]`完全包含在`[p_date_start,p_date_end]`中时,这不起作用。 – 2011-01-27 12:43:16

2

SELECT ID,DATE_START,DATE_END FROM thetable 哪里都不(DATE_END < p_date_start OR p_date_end < DATE_START)

+0

谢谢,那是我第一次尝试。它不能解决`[p_date_start,p_date_end]`完全包含在`[date_start,date_end]`中的问题。它们相交,但查询不返回。 – 2011-01-27 12:38:46

3

根据你的DBMS,你可能能够使用OVERLAPS操作员。

select * from your_table 
where (date '2011-01-15', date '2011-01-18') overlaps (date_start, date_end)