Задавайте вопросы, мы ответим
Вы не зашли.
Задача такова.
У каждого мастера свой график работы (периодически меняющийся). Им даются заказы на время выполнения которых мастер считается занятым. Нужно выбрать мастеров свободных в определенный промежуток времени, причем величина свободного окна должна быть не менее чем х (например, найти тех кто свободен с 8 до 13 такого-то числа и свободное окно не менее полутора часов).
Я предполагаю использовать следующую таблицу:
Неактивен
Стоило написать о проблеме и появилось понимание. Мне не нравиться, что в предложенном способе нельзя получить ответ одним простым запросом.
Как вариант, еженочно генерировать таблицу на определенный срок (например месяц), где будут указаны только свободные промежутки. Т.е. если мастер работает 15.06.2010 с 8 до 19 с перерывом на обде с 13 до 14, то в таблице будут две записи на этот день с 8 до 13 и с 14 до 19. При получении заказа с 10 до 12, запись с 8 до 13 замениться на две с 8 до 10 и с 12 до 13.
Тогда исходная задача решается одним простым запросом к базе.
Есть ли предел совершенству или есть ещё более простое решение?
Неактивен
Наличие day_of_week эффективно сводит задачу к многозапросной. Или нужно
прегенерить реальное расписание, или считать для каждой строки (и тем самым
убить возможность использовать индексы).
Без day_of_week задача сводится к «все мастера, кроме занятых в это время».
А «занятый» — это time_from < 8 and time_to > 13. Ну то есть LEFT JOIN таблицы
мастеров с расписанием с вот этим дополнительным условием.
Неактивен