Узнать пересечение 2-х интервалов дат

anpv

Guest
Узнать пересечение 2-х интервалов дат

Доброго времени суток.
Подскажите как узнать пересечение 2-х интервалов дат в SQL-запросе.
Т.е. имеются 4 даты:
date1_start, date1_end и date2_start, date2_end
Первый времнной промежуток date1 составляют даты date1_start, date1_end, а второй date2 составляют даты date2_start, date2_end.
В таблице содержатся 2 поля типа DATETIME date_start и date_end.
Нужно узнать не пересекаются ли эти два промежутка дат.
Т.е. возможны 4 ситуации:
1) Промежуток date1 содержит date2
2) Промежуток date2 содержит date1
3,4) Промежутки date1 и date2 пересекаются по start и end
Я делаю так:
select count(*) from table where (date_start >= "2004/6/1" and date_start <= "2004/6/10") or (date_end >= "2004/6/1" and date_end <= "2004/6/10") or (date_start >= "2004/6/1" and date_end <= "2004/6/10") or (date_start <= "2004/6/1" and date_end >= "2004/6/10");
Что не очень красиво и слишком громоздко и непонятно.
 

anpv

Guest
Ну можно конечно заменить >= и <= на between, но что от этого изменится?
 

anpv

Guest
Чтобы было правильно, потому что этот запрос иногда неправильно работает и я немогу понять где ошибка.
 

Romantik

TeaM PHPClub
Что значит иногда?
Я сделал бы это с помощью РНР
залив в масив существующие ячейки в промежутке
и потом бы проверял
 

anpv

Guest
> Что значит иногда?
Т.е. я не знаю правильно ли работает запрос, а с помощью PHP наверное это будет сложнее чем с помощью SQL-запроса.
 

Romantik

TeaM PHPClub
да с помощью SQL быстрее, но с помощью PHP легче сейчас и в дальнейшем, модифицируя алгоритм

кстати я вот скажу что с BETWEEN и датами были траблы, использовал >= и <=
не знаю как сейчас...
А нахождение нужного делал в РНР
 

IL78

Guest
Не совсем понятен вопрос.

Имхо, чтобы подсчитать число записей в базе, в которых интервалы между date_start и date_end пересекаются с неким постоянным интервалом (напр. "2004/6/1","2004/6/10"), достаточно проверки

Код:
where (date_start <= "2004/6/10" and date_end >= "2004/6/1")
т.е. выбрать все интервалы, которые начались ранее конца заданного интервала и окончились позже его начала. Все 4 варианта сводятся к этому.
 
Сверху