时隙可用性多天mysql

时隙可用性多天mysql,mysql,calendar,Mysql,Calendar,我有一个关于MySQL中空闲时间段检索的问题。我有两个表 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调度器保存计划任务

我有一个关于MySQL中空闲时间段检索的问题。我有两个表

 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))
        )
我错过了什么


提前谢谢

我想试试这样的东西:

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

这样,您要求的时间段与任何客房预订都不相交。

这是可行的,但我不完全明白您的意思,请您再详细说明一下好吗?当然,如果我不够清楚,很抱歉。RoomStart和RoomEnd之间的房间预订为了清楚起见,我使用这些名称占用了一个时间段SlotStart SlotEnd当且仅当预订在插槽结束之前开始,在插槽开始之前结束,也就是说RoomStart=SlotStart。为了验证这是真的,你可以尝试想象所有不同的可能性。因此,在查询中,您可以选择不存在交叉预订的时段。希望这更清楚一点。
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))
    )