Если временная метка находится между двумя другими временными метками того же человека для другого бронирования - PullRequest
0 голосов
/ 05 мая 2018

У меня есть таблица ниже.

booking_person TABLE

Я пытаюсь проверить, есть ли какое-либо совпадение времени (не даты) человека в каком-либо другом бронировании. Как человек не может быть в 2 местах одновременно. Хорошо, если время начала бронирования совпадает с временем окончания другого бронирования.

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

select * from booking_person y 
where exists (
    select 1 from booking_person y2 
    where y.booking_id <> y2.booking_id 
    and y.person_id = y2.person_id 
    and FROM_UNIXTIME(y.date_time) BETWEEN FROM_UNIXTIME(y2.date_time) and FROM_UNIXTIME(y2.date_time_end)
    and FROM_UNIXTIME(y.date_time_end) BETWEEN FROM_UNIXTIME(y2.date_time) and FROM_UNIXTIME(y2.date_time_end)     
)
order by person_id

1 Ответ

0 голосов
/ 05 мая 2018

Логика для перекрытия двух периодов времени:

  • первый начинается раньше, чем второй заканчивается
  • первый заканчивается после второго

Вы можете перевести это в SQL как:

select bp.*
from booking_person bp 
where exists (select 1
              from booking_person bp2 
              where bp2.person_id = bp.person_id and
                    bp2.booking_id <> bp.booking_id and
                    bp2.date_time < bp.date_time_end and
                    bp2.date_time_end > bp.date_time
             )
order by bp.person_id;

Обратите внимание, что здесь используются строгие неравенства. Я не уверен, что конечные точки считаются перекрывающимися. Эта версия не считает перекрытия на конечных точках перекрытиями.

...