2011-01-27 3 views
3

Я хочу извлечь строки из таблицы, интервал которой пересекается с интервалом, указанным в запросе. Предполагая, что у меня есть простая таблица ID, DATE_START, DATE_END и два параметра запроса P_DATE_START и P_DATE_END, что является самым простым способом выражения запроса, чтобы найти все строки, для которых [DATE_START, DATE_END] имеет хотя бы один общий элемент с [P_DATE_START, P_DATE_END]?Поиск совпадающих интервалов с использованием SQL


Update:

Для того, чтобы желаемый результат понятнее, пожалуйста, найти список входных значений и ожидаемых результатов ниже. Колонны: 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 –

+0

@Martin: это, кажется, именно то, что я ищу, спасибо! Я буду голосовать, чтобы закрыть свой вопрос, если это так. –

ответ

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]'. –

+0

@Robert, он делает! Например, если [5,6] полностью содержится в [1,10], то верно, что 5 <= 10 and 6 > = 1. –

+0

@ Илья: см. Мое обновление вопроса. Проверка должна быть симметричной, т. Е. Если она работает с вводом '[5,6]' и значением строки '[1, 10]', она должна работать с вводом '[1,10]' и значением строки '[5, 6] '. –

2

ВЫБРАТЬ идентификатор, DATE_START, date_end ИЗ таблицы, с WHERE нет (date_end < p_date_start ИЛИ p_date_end < DATE_START)

+0

Спасибо, это была моя первая попытка. Он не решает проблему, когда '[p_date_start, p_date_end]' полностью содержится в '[date_start, date_end]'. Они пересекаются, но запрос не возвращается. –

3

В зависимости от ваших DBMS, вы могли бы иметь возможность использовать оператора OVERLAPS.

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

Полезно знать, спасибо. –

Смежные вопросы