mysql检查讲师是否在指定时间上课

vawmfj5a  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(310)

我有一个课程预定日历,我正在检查讲师是否在指定时间预定或是否有空。
我有下表要保存 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) )

我做错什么了?
谢谢您
nue99wik

nue99wik1#

我认为,因为between是inclusive语句正在捕获以201806271200作为结束时间的记录。如果您运行以下命令,则不会得到显示有可用课程的结果。

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

是1200算作结束时间,所以下一个的开始时间需要在1201或者结束时间需要在1159,开始时间可以是1200

wvmv3b1j

wvmv3b1j2#

找到任何重叠的正确逻辑是:

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

逻辑基本上是说,如果以下两个条件成立,教员就不可用:
a课在结束时间之前随时开始。
相同的课程在开始时间之后的任何时间结束。

相关问题