mysql для проверки Инструктор доступен для урока в выбранное время - PullRequest
0 голосов
/ 29 июня 2018

У меня есть календарь бронирования урока, и я пытаюсь проверить, был ли инструктор забронирован в указанное время или доступен.

У меня есть следующая таблица для сохранения 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) ) 

Что я здесь не так делаю?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Правильная логика для нахождения любых совпадений будет:

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
                 );

Логика в основном говорит, что инструктор недоступен, если выполняются следующие два условия:

  • Урок начинается в любое время до его окончания.
  • Тот же урок заканчивается в любое время после времени начала.
0 голосов
/ 29 июня 2018

Я думаю, что из-за того, что между включается, оператор ловит записи с 201806271200 в качестве конечного времени. Если вы выполните следующее, вы не получите результатов, показывающих, что есть доступные уроки.

SELECT * FROM lesson_registrations
WHERE 
(startTime BETWEEN '201806271159' AND '201806271359' ) 

да 1200 считается временем окончания, поэтому время начала следующего должно быть в 1201 или время окончания должно быть в 1159, а время начала может быть 1200

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