myks92
@myks92
Нашёл решение — пометь вопрос ответом!

MYSQL. Как выбрать все даты которые падают в диапазон?

Есть три таблицы: appointment, profile, event, certification(назначения, профиль, мероприятия, аттестации)

5bc2932dcc449589658243.pngДанные:
Мероприятие 1 проходит в даты 2018-11-24 по 2018-11-25 (продолжительность 2 дня)
Мероприятие 2 проходит в даты 2018-11-25 по 2018-11-25 (продолжительность 1 день)

Формат:
Даты в базе данных хранятся в формате DATE Y-m-d

Мне необходимо осуществить проверку на свободные даты пользователя.

Свободная дата определяется по мероприятию (таблица event). При назначении пользователя (таблица appointment) на мероприятие - делаем выборку всех назначений текущего пользователя, кроме текущего события и выполняем поиск на свободные даты по таблице с мероприятиями (таблица event). Если мы находим назначение, диапазон дат мероприятия или дата мероприятия которая совпадает/входит в даты текущего мероприятия, то выдаем ошибку о том, что пользователь уже занят в данные даты.

Я это делаю таким запросом:
SELECT `appointment`.* FROM `appointment` 
LEFT JOIN `event` ON `appointment`.`event_id` = `event`.`id`
LEFT JOIN `certification` ON `appointment`.`judge_comitet_id` = `certification`.`id` 
LEFT JOIN `profile` ON `certification`.`user_id` = `profile`.`user_id` 
WHERE (`profile`.`user_id`=139) 
AND (`event`.`id` != 55) 
AND (`event`.`date_from` >= 2018-11-25) 
AND (`event`.`date_to` <= 2018-11-25) 
GROUP BY `event`.`id` 
ORDER BY `event`.`date_to`


Данный запрос работает только при условии, если у мероприятия, на которое осуществляется назначение, диапазон дат шире, чем у мероприятий на которые пользователь так же был назначен...

Однако, при назначении на Мероприятие 2, которое проходит в один день с 2018-11-25 по 2018-11-25 и имеет диапазон дат меньше, чем у мероприятий на которые пользователь так же был назначен — не находит ни одного назначения. Хотя данное назначение существует на Мероприятие 1, которое проходит в два дня с 2018-11-24 по 2018-11-25 с более широким диапазоном дат.

Как мне сделать запрос на свободные даты пользователя, чтобы он учитывал все мероприятия и проверял все диапазоны дат, даже те, которые выходят за рамки текущего мероприятия?

Благодарю!
  • Вопрос задан
  • 1037 просмотров
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
mysql datetime between
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Перекрытие диапазонов времени:
(start1 < end2 && start2 < end1)
Соотношение < или <= выбирается по месту.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы