Сетка расписания для мастеров оказывающих услуги построена с шагом в 30 минут.
Клиент заказывает одну или несколько услуг.
Например: стрижка машинкой - 30 минут, стрижка бороды - 30 минут. Общее время затрат на такого клиента - 60 минут.
Задача: найти в расписании мастера временные слоты, удовлетворяющие времени затрат на клиента и предложить клиенту время для записи.
Имеем следующие вводные данные:
общее время оказания услуг - 60 минут.
Найти слоты доступные для записи
Для клиента, подходящее время для записи в строках 1,2,3,5 так временные интервалы следуют друг за другом и доступное время мастера достаточно для выполнения услуг на 60 минут.
Строка 4 не подходит, так как окно только на 30 минут, а интервал между недоступен для записи.
строка 7 не удовлетворяет требуемому времени записи. доступно только для услуги в 30 минут, а следующая запись начинается с 13 часов
строка 8 также доступна только на 30 минут.
Каким образом решаются подобные задачи, и возможно ли её решение одним запросом?
Вам нужно соединить интервалы левым соединением сами с собой взяв Мин(Таб1.ДатаНачала) и Макс(Таб2.ДатаОкончания) где Таб2.ДатаОкончания = Таб1.ДатаНачала+(Таб2.НомерИнтервала-Таб1.НомерИнтервала)*&РазмерИнтервала. Получите "Не прерывающиеся" интервалы. Потом выберите из них те что подходят по длительности.
Второй вариант:
Соединить левым соединением по Истина, сгруппировать по Таб1.ДатаНачала Как ДатаНачала, просуммировав КоличествоРазличные(Таб2.ДатаОкончания) Как КоличествоИнтервалов и взяв Макс(Таб2.ДатаОкончания) Как ДатаОкончания.
Из результата выбрать ДатаОкончания = ДатаНачала+КоличествоИнтервалов*&РазмерИнтервала.