查询空闲时间MYSQL
Query to get vacant time MYSQL
需要一些逻辑帮助来制定 MYSQL 查询,该查询得到的结果不在 table.
的数据范围内
我有一个名为 table 的时间表,其中包含数据类型为 'time' 的列,指示该特定时间表何时开始和结束,以及一个引用自 table [=21= 的外键] 时间表将在其中进行。在其搜索功能的 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-ing 中成为尽可能多的菜鸟。
您可以使用 BETWEEN
运算符。
SELECT *
FROM schedule
WHERE sched_end BETWEEN '10:00:00' AND '11:00:00'
把时间存储在那里是个坏主意。使用 DATETIME 代替 need_start - 一天和 need_end - 另一天(下一个?或者我想在你的酒店住一个星期?)天的情况。
但是无论如何,根据你现在拥有的,试试这个
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
);
请注意,我通过将开始时间增加一秒并从结束时间减去一秒来补偿 "start inclusive" 行为。您应该在将时间提供给 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
功能来帮助你。
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 |
+------+
需要一些逻辑帮助来制定 MYSQL 查询,该查询得到的结果不在 table.
的数据范围内我有一个名为 table 的时间表,其中包含数据类型为 'time' 的列,指示该特定时间表何时开始和结束,以及一个引用自 table [=21= 的外键] 时间表将在其中进行。在其搜索功能的 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-ing 中成为尽可能多的菜鸟。
您可以使用 BETWEEN
运算符。
SELECT *
FROM schedule
WHERE sched_end BETWEEN '10:00:00' AND '11:00:00'
把时间存储在那里是个坏主意。使用 DATETIME 代替 need_start - 一天和 need_end - 另一天(下一个?或者我想在你的酒店住一个星期?)天的情况。
但是无论如何,根据你现在拥有的,试试这个
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
);
请注意,我通过将开始时间增加一秒并从结束时间减去一秒来补偿 "start inclusive" 行为。您应该在将时间提供给 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
功能来帮助你。
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 |
+------+