Я пытаюсь написать функцию для перемещения запланированной задачи. Расписание не может пересекаться с каким-либо другим событием. Мои пользовательские входы:
Моя таблица выглядит следующим образом:
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_time
– orig_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 эта проблема кажется сложной. Конечно, я мог бы схватить каждое расписание с начальным временем дня или двух раньше, а время окончания – через день или два, а затем сравнить мой интервал, но это кажется очень взломанным.
Есть идеи?