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