2011-01-27 425 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)