Php 查询以获取空闲时间

Php 查询以获取空闲时间,php,mysql,multiple-tables,Php,Mysql,Multiple Tables,我想了解一些关于制定MYSQL查询的逻辑帮助,以获取不在表数据中的结果 我有一个名为schedule的表,其中有数据类型为“time”的列,指示此特定计划的开始和结束时间,以及一个外键,该外键引用了计划将在其中发生的表“rooms”。在php代码的搜索功能中,我想添加一个功能,显示当前未被日程安排占用或空置的房间的结果。我添加了一个jquery滑块,专门获取搜索者想要的开始时间和结束时间 TABLE 'schedule' room sched_start sc

我想了解一些关于制定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等等,以确定两者之间是否有空闲时间。有人能帮我吗

我会非常感激所有的帮助和憎恨,因为我可以成为你的朋友

您可以使用BETWEEN操作符

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

把时间储存在那里是个坏主意。改用DATETIME来涵盖需要从一天开始到下一天结束的情况?或者我想在你们酒店住一周?一天

但不管怎样,就你现在所拥有的,试试这个

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

您需要特别排除在给定时间段内占用的房间

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
);
请注意,我通过在开始时间上加一秒钟,在结束时间上减去一秒钟来补偿开始包容性行为。在将时间提供给SQL之前,应该这样做,以避免在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 );
此外,如果要使用多行执行此查询,则确实需要适当的索引。使用解释功能来帮助您

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 |
+------+
只是为了证明@M0RTIS的解决方案是错误的

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

因此,用户需要满足或不满足以下条件的行:input starttable start。不存在或左连接。。。哪里IS NULL是否有助于使用负条件24小时格式?日期在哪里?这将如何满足他的需求?问题是如果给出两个输入,如何比较时间表。这个查询肯定给了他一个如何实现需求的想法。@RohitGupta这个问题是用PHP标记的,所以实际上这个解决方案可以与应用程序级逻辑结合使用来获得答案-但这不是我的方式。实际上使用Datetime是个坏主意!!!您需要分别存储日期和时间。否则,作为一个例子,在每天上午10点找到免费的东西会变得很糟糕。真的吗?如果我们在这里不依赖时间,也依赖日期。我们将在这里使用两种不同的方法。在DATETIME上做什么比将日期和时间串联起来更简单?顺便说一句,在任何一天上午10点找到免费的东西应该是找到从datetime1到datetime2的免费东西。你在开玩笑吗?那太全面了!否:10:00:00介于10:00:00和任何其他时间之间。你应该玩+/-1秒,然后时间是线性的。因此,您的条件不必要地复杂。@M0RTIS:您很可能希望能够背靠背地计划会议,因此如果前一次会议在该时间结束,您应该能够在10:00:00开始会议。这就产生了BETWEEN的问题,因为BETWEEN在边上是包含的。@草莓:有一些边的情况需要记住。如果您想在10:00到11:00之间计划一次会议,那么您不应该预订已经在10:15到10:45之间预订的房间,也不应该预订已经在9:00到12:00之间预订的房间。那么,为什么要使用“按空加入”而不是颠倒条件呢?不是这样。如果我们假设输入@start、@end是正确的,则start在end之前,否则任何实例实际上都没有意义,这与我们需要的是相同的。时间是线性的?在这种情况下,它们是相同的。更复杂的是,你需要更多的染料。你是对的。伟大的example@carlowmanangan我希望days列是一个位整数,其中1表示“星期一”,127表示“每天”!!!