Комплексный запрос MySQL – проверка на совпадение интервалов DATE

Я пытаюсь написать функцию для перемещения запланированной задачи. Расписание не может пересекаться с каким-либо другим событием. Мои пользовательские входы:

  • schedule_id (int)
  • new_start_time (DATETIME)

Моя таблица выглядит следующим образом:

Schedules | schedule_id | start_time | end_time | task_id | 1 | 2015-12-21 02:00:00 | 2015-12-21 04:00:00 | 1 | 2 | 2015-12-21 08:30:00 | 2015-12-21 09:30:00 | 1 | 3 | 2015-12-22 01:00:00 | 2015-12-22 02:00:00 | 2 Tasks | task_id | name | max_duration | 1 | do things | 2 | 2 | do stuff | 1 

У пользователя есть время между start_time и end_time чтобы запустить «задачу». Пользователь не может начинать «задание» до этого окна. После того, как этот пользователь начнет задание, у них есть все, что max_duration для завершения этого max_duration для этого идентификатора задачи. Существует также 15-минутное окно для настройки для следующей задачи. Это означает, что пользователь, который max_duration задачу за 1 секунду до окончания окна, по-прежнему имеет max_duration время для завершения задачи. Поэтому «фактическое окно», в которое ничего не может быть запланировано, – start_time to ( end_time + max_duration + 15 ). Я хотел бы переместить событие (или вставить новый), но я должен проверить на перекрытия. По сути, я должен обеспечить:

  • start_time ли start_time из пользовательского ввода любое end_time другого времени + max_duration + 15 ?
  • Выполняется ли end_time + max_duration +15 в любое время start time другого расписания. end_time просто получается путем принятия нового start_time и добавления первоначальной продолжительности ( end_time = ( orig_end_timeorig_start_time ) + start_time

Например, приведенная выше таблица действительна для 1 и 2 sched_id, потому что пользователь может начать любое время между 2:00 и 4:00. Предполагая, что он стартует в конце, 3:59:59 событие продлится до максимума до 5:59:59. Даже с окном очистки 15 минут это все равно приводит к 6:14:59, а так как следующий график начинается в 8:30, это нормально.

Я часами обнимал это вокруг. Я хотел бы сделать это в чистом MySQL, но я рассматриваю использование PHP, если мне действительно нужно. Даже в PHP эта проблема кажется сложной. Конечно, я мог бы схватить каждое расписание с начальным временем дня или двух раньше, а время окончания – через день или два, а затем сравнить мой интервал, но это кажется очень взломанным.

Есть идеи?