我对MySQL中的空闲时隙检索有疑问。我有2个表。
Table 1:
TimeSlots (Defines the available timeslots in 15 minutes)
Columns : StartTime (**Time**), EndTime(**Time**)
Data:
00:00:00 , 00:15:00
00:15:00 , 00:30:00
And so on until 23:45:00 , 00:00:00
表2计划程序(保留计划任务)
Columns : idScheduler (**pk**) , Room (**int, fk**), StartDateTime (**DateTime**), EndDateTime (**DateTime**)
我用来检索一天的开放时间的查询是:
SELECT StartTime, EndTime FROM TimeSlots WHERE
NOT Exists (
SELECT Room, StartDateTime, EndDateTime FROM Scheduler
WHERE Room = 'Room1'
AND DATE(StartDateTime) = '2012-12-20'
AND
(StartDateTime >= concat('2012-12-20', ' ' ,StartTime) AND
StartDateTime <= concat('2012-12-20', ' ' ,EndTime))
OR
(EndDateTime >= concat('2012-12-20', ' ' ,StartTime) AND
EndDateTime <= concat('2012-12-20', ' ' ,EndTime))
OR
(EndDateTime <= concat('2012-12-20', ' ' ,StartTime) AND
StartDateTime >= concat('2012-12-20', ' ' ,EndTime))
)
Room和StartDateTime将成为最终解决方案中的参数。
我遇到的问题是,如果房间被预订,例如跨越多个时段 (例如:1,1,2012-12-20 13:10:00,12012-12-20 13:55:00)
如果我运行上面提到的查询,它将提供此输出:
13:00:00 - 13:15:00
13:15:00 - 13:30:00
13:30:00 - 13:45:00
13:45:00 - 14:00:00
我在这里缺少什么?
提前致谢
答案 0 :(得分:0)
我会尝试这样的事情:
SELECT StartTime, EndTime FROM TimeSlots WHERE
NOT Exists (
SELECT Room, StartDateTime, EndDateTime FROM Scheduler
WHERE Room = 'Room1'
AND DATE(StartDateTime) = '2012-12-20'
AND
(StartDateTime <= concat('2012-12-20', ' ' ,EndTime) AND
EndDateTime >= concat('2012-12-20', ' ' ,StartTime))
)
通过这种方式,您需要一个与任何房间预订不相交的时间段。