查询获取空闲时间MYSQL

时间:2015-08-15 07:42:57

标签: php mysql multiple-tables

想要制定一个MYSQL查询,以获得不在表数据范围内的结果。

我有一个名为schedule的表,其中包含数据类型为'time'的列,指示此特定计划的开始和结束时间,以及从将在其中进行计划的表'rooms'引用的外键。在其搜索功能的PHP代码中,我想添加一个功能,显示当前没有被时间表占用或空置的房间的结果。我添加了一个jquery滑块来专门获取搜索者想要的开始时间和结束时间。

   TABLE 'schedule'
   room        sched_start      sched_end
     1           09:00:00       10:00:00
     1           11:00:00       12:00:00
     2           07:30:00       08:30:00
     2           11:30:00       13:00:00

例如,搜索者想要从10:00:00到11:00:00搜索空房间。根据数据库,结果应显示搜索结果中应显示房间1和房间2,因为两个房间都不会在搜索者的指定时间内被占用。我想按时间顺序比较所有类似房间的时间表,第一行或第一个时间表的'sched_end'和后续行的sched_start或时间表等,以确定是否有空闲时间之间。任何人都可以帮我吗?

所有的帮助和讨厌都会非常受欢迎,因为我可以在MySQL中使用尽可能多的菜鸟。

4 个答案:

答案 0 :(得分:8)

DROP TABLE IF EXISTS schedule;

CREATE TABLE schedule
(room        INT NOT NULL
,schedule_start      TIME NOT NULL
,schedule_end TIME NOT NULL
,PRIMARY KEY(room,schedule_start)
);

INSERT INTO schedule VALUES
(1,'09:00:00','10:00:00'),
(1,'11:00:00','12:00:00'),
(2,'07:30:00','08:30:00'),
(2,'11:30:00','13:00:00'),
(3,'09:30:00','10:30:00'),
(3,'11:00:00','12:00:00'),
(4,'10:30:00','10:45:00');

SET @start:= '10:00:00';
SET @end:= '11:00:00';

SELECT DISTINCT x.room
        -- or whatever columns you want from whichever table you want 
           FROM schedule x 
           LEFT 
           JOIN schedule y 
             ON y.room = x.room 
            AND y.schedule_start < @end 
            AND y.schedule_end > @start 
        -- other tables can join in here
          WHERE y.room IS NULL;
+------+
| room |
+------+
|    1 |
|    2 |
+------+

http://sqlfiddle.com/#!9/1b677/1

只是为了证明@ M0rtiis的解决方案是错误的......

SELECT DISTINCT room
           FROM schedule
          WHERE @end <= schedule_start
             OR @start >= schedule_end;
+------+
| room |
+------+
|    1 |
|    2 |
|    3 |
+------+

答案 1 :(得分:3)

您需要的是明确排除在给定时期内占用的房间。

SET @start = '10:00:01';
SET @end = '10:59:59';

SELECT *
FROM `schedule` -- you probably want to select from rooms here...
WHERE room NOT IN (
  SELECT room
  FROM `schedule`
  WHERE sched_start BETWEEN @start AND @end
  OR sched_end BETWEEN @start AND @end
  OR @start BETWEEN sched_start AND sched_end
  OR @end BETWEEN sched_start AND sched_end
);

请注意,我补偿了&#34;开始包容性&#34;通过向开始时间添加一秒并从结束时间减去一秒来执行行为。您应该在将时间提供给SQL之前执行此操作,以避免在那里进行那些计算。

此查询会过滤所有情况,包括重叠会议。

或者,或许稍微更连贯:

SET @start:= '10:00:00';
SET @end:= '11:00:00';

SELECT DISTINCT room
           FROM schedule
          WHERE room NOT IN ( SELECT room
                                FROM schedule
                               WHERE schedule_start < @end
                                 AND schedule_end > @start );

此外,如果此查询要执行的不仅仅是几行,那么您确实需要正确的索引。使用EXPLAIN功能为您提供帮助。

答案 2 :(得分:2)

存放TIME的坏主意。使用DATETIME来覆盖need_start的情况 - 一天和need_end - 另一个(下一个?或者我想成为你酒店的客人一周?)。

但无论如何,你现在试试这个

SELECT DISTINCT 
  room
FROM schedule
WHERE 
    '11:00:00' <= sched_start
    OR
    '10:00:00' >= sched_end

http://sqlfiddle.com/#!9/dafae/9

答案 3 :(得分:0)

您可以使用BETWEEN运算符。

SELECT *
FROM schedule
WHERE sched_end BETWEEN '10:00:00' AND '11:00:00'