cyberia
@cyberia
Веб-разработчик, плавно перехожу в мобильные разра

Какой алгоритм использовать лля определения доступности временного промежутка?

Разрабатываю систему предварителтной записи через сайт. Сейчас столкнулся с проблемой, не могу придумать как красиво и правильно определить доступно или занято нужное время.
Немного подробностей:
Есть сущность "Запись", у которой два основных параметра: время и продолжительность.
Допустим, есть две таких сущности: (9:00, 30 мин), (10:00, 1 час). Понятно, что (9:35, 1 час) уже будет невалидным, так как на 10 уже есть запись.
Подскажие, какой алгоритм можно использовать? Не прошу код, просто пните в нужном направлении.
  • Вопрос задан
  • 2718 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Поразмыслив пришёл к варианту:
SELECT count(*) AS x FROM records 
    WHERE (begin BETWEEN '{$newRecordBegin}' AND '{$newRecordEnd}') OR
          ('{$newRecordBegin}' BETWEEN begin AND end)

Первая часть условия - начало какой-либо старой записи попадает в середину новой.
Вторая часть - начало новой записи попадает в середину какой-либо старой .
Если хоть одно условие выполнено - count(*) > 0, вставлять запись нельзя.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
madmages
@madmages
Человек прямоходящий
на вскидку пришло в голову хранить в безе время начала и время конца и потом уже просто одним SQL запросом выяснять свободно или нет
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
0. Пытаемся вставить новую запись newRecordStart, newRecordLength
1. Получаем две ближайшие по времени записи, одну до (prevRecordStart, prevRecordLength) и одну после новой (nextRecordStart, nextRecordLength).
2. Новая запись не должна пересекаться с предыдущей:
(newRecordStart >= prevRecordStart+prevRecordLength)
3. Новая запись не должна пересекаться со следующей:
(newRecordStart+newRecordLength <= nextRecordStart)
4. Если оба условия выполнены - можно вставлять запись.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы