0

我有一个关于 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 Scheduler(持有计划任务)

 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、2012-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

我在这里想念什么?

提前致谢

4

1 回答 1

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

通过这种方式,您要求的时间段不与任何房间预订相交。

于 2012-12-21T08:54:09.627 回答