Детский вопрос про пересечение интервалов дат

Фанат

oncle terrible
Команда форума
полез в интернет проверить себя, и разнообразие ответов несколько озадачило.

Задача классическая - в базе есть интервалы дат
Код:
+-----------+--------------+------------+
| object_id | period_start | period_end |
+-----------+--------------+------------+
|      1042 | 2014-03-01   | 2014-03-05 |
|      1042 | 2014-03-06   | 2014-03-08 |
|      1042 | 2014-03-11   | 2014-03-14 |
|      1042 | 2014-03-19   | 2014-03-22 |
|      1042 | 2014-03-29   | 2014-04-10 |
|         1 | 2014-03-11   | 2014-03-14 |
+-----------+--------------+------------+
Дается произвольный интервал и надо проверить, не пересекается ли он с каким-либо в базе.
 

akd

dive now, work later
Команда форума
exists где датаОТпроверяемого битвин или датаДОпроверяемого битвин
 

akd

dive now, work later
Команда форума
peon, именно так как я написал. чтобы проверить пересекается или нет, достаточно проверить входит или не входит в любой из существующих периодов любая из двух дат твоего периода.
у меня слово "битвин" значит "битвин period_start and period_end" :)
 

akd

dive now, work later
Команда форума
да, уже понял. периоды бывают разные. надо еще проверять даты существующих периодов таким же способом относительно нового.
 

Фанат

oncle terrible
Команда форума
очень часто этот ответ звучит в интернете, но он не выдерживает никакой критики.
почему-то люди переносят решение для задачи "проверить, входит ли дата в интервал" на задачу "проверить, пересекаются ли интервалы"
 
Последнее редактирование:

MiksIr

miksir@home:~$
очень часто этот ответ звучит в интернете, но он не выдерживает никакой критики.
почему-то люди переносят решение для задачи "проверить, входит ли дата в интервал" на задачу "проверить, входит ли интервал в интервал"
Это мне?
 

Фанат

oncle terrible
Команда форума
Тогда поясните случай, когда это не будет работать.
аааааа, позор мне. Ошибся с проверкой.

Я, конечно, дебил, и это работает, но всё равно - проверочных запросов должно быть шесть. один ничего не доказывает.
А вот СО-шный топик как раз интереснее. Но там чувак почему-то тоже на фиддле только один запрос выполняет
 
Последнее редактирование:

artoodetoo

великий и ужасный
Почему должно быть шесть запросов? Похоже я не понимаю что требуется.
 

Фанат

oncle terrible
Команда форума
Почему должно быть шесть запросов? Похоже я не понимаю что требуется.
Шесть запросов нужно для проверки.
Чтобы проверить логику, надо сделать шесь запросов с разными входящими интервалами.

Потому что разных вариантов может быть шесть. В СОшном ответе они перечислены (правда, в какой-то непонятной нотации):
- и начало и конец раньше начала в базе
- начало раньше начала в базе, конец между началом и концом в базе
- и начало и конец между началом и концом в базе
- и начало и конец в базе между началом и концом.
- начало между началом и концом в базе, конец позже конца в базе
- и начало и конец позже конца в базе.

Если результат отличается от 0-1-1-1-1-0, то логика неверна.
 
Последнее редактирование:

Crys

Двинутый новичок
Чтобы проверить логику, надо сделать шесь запросов с разными входящими интервалами.
Я ошибаюсь, или там тупо два условия. Выбирается то, что оканчивается позже начальной даты и начинается раньше окончательной даты.
Логично, что интервалы, которые оканчиваются раньше начальной даты в нашу выборку не попадут... а из оставшихся в выборку не попадают те, которые начинаются позже нашей окончательной даты..
Там проблема может быть только если в базе дата начала больше даты окончания...
 

artoodetoo

великий и ужасный
Crys, а не надо кривые интервалы писать в базу :)
Фанат, не сомневаюсь, Вы уже проверили. А я уже использовал такое условие в реале, мне такие тесты не нужны.
 

MiksIr

miksir@home:~$
А я на пальцах проверил. Сделал распальцовку на двух руках, и прямо на столе проверил ;)
 

Фанат

oncle terrible
Команда форума
Фанат, не сомневаюсь, Вы уже проверили. А я уже использовал такое условие в реале, мне такие тесты не нужны.
Опять же, при всем уважении и сознании собственной глупости - но пост на форум же пишется не для себя.
Если делать только одну проверку, то можно вообще не делать, с тем же успехом.
А если уж озаботиться фиддлом, то тогда надо делать полную. Здесь, у меня, вроде, логика не лажает )
 
Сверху