У меня есть календарь бронирования уроков, и я пытаюсь проверить, зарезервирован ли Инструктор в указанное время или доступен.
У меня есть следующая таблица для сохранения lesson_registrations
| id | InstructorId | startTime | endTime |
| 1 | 2 | 201806271100 | 201806271200 |
| 2 | 2 | 201806271400 | 201806271500 |
Поэтому в соответствии с этой таблицей Инструктор доступен для урока между 201806271200
и 201806271400
но когда я запускаю следующий запрос, он отмечает, что Инструктор будет забронирован.
SELECT * FROM lesson_registrations
WHERE
((startTime BETWEEN '201806271200' AND '201806271400' )
OR (endTime BETWEEN '201806271200' AND '201806271400')
OR ('201806271200' BETWEEN startTime AND endTime)
OR ('201806271400' BETWEEN startTime AND endTime) )
Что я здесь делаю неправильно?
Спасибо
Я думаю, что, поскольку между включенными, оператор захватывает записи с 201806271200 как время окончания. Если вы выполните следующее, вы не получите никаких результатов, показывающих, что есть уроки.
SELECT * FROM lesson_registrations
WHERE
(startTime BETWEEN '201806271159' AND '201806271359' )
да 1200 считается конечным временем, поэтому время начала следующего должно быть в 1201, или время конца должно быть в 1159, а время начала может быть 1200
Правильная логика нахождения совпадений:
select lr.*
from lesson_registrations lr
where lr.startTime < 201806271400 and
lr.endTime > 201806271200;
Получить инструкторов, которые доступны:
select i.*
from instructors i
where not exists (select 1
from lesson_registrations lr
where lr.instructorId = i.instructorId and
lr.startTime < 201806271400 and
lr.endTime > 201806271200
);
Логика в основном говорит о том, что инструктор недоступен, если выполняются следующие два условия: