我正在尝试在我的预订系统中获取一系列可用的时间段,同时考虑到任何现有的预订及其完成时间。 时段以 15 分钟为间隔,只能在 09:00 至 18:00 之间接受预订。
我遇到的问题是它没有显示所有可用时间段。在 this SQL fiddle下面的架构和数据错过了最后一个时间段范围,但这不仅仅限于最后一条记录。如果我只有两个预订 ( SQL Fiddle ),它仍然只显示一个预订。
架构:
CREATE TABLE bookings
(`id` int, `time_from` datetime, `time_to` datetime)
;
INSERT INTO bookings
(`id`, `time_from`, `time_to`)
VALUES
(2, '2013-11-20 09:00:00', '2013-11-20 09:15:00'),
(3, '2013-11-20 11:00:00', '2013-11-20 11:30:00'),
(4, '2013-11-20 12:00:00', '2013-11-20 12:45:00'),
(5, '2013-11-20 16:30:00', '2013-11-20 16:45:00'),
(6, '2013-11-20 16:45:00', '2013-11-20 17:15:00')
;
查询:
SELECT available_from, available_to
FROM (
SELECT @lasttime_to AS available_from, time_from AS available_to, @lasttime_to := time_to
FROM (SELECT time_from, time_to
FROM bookings
WHERE time_to >= '2013-11-20 09:00'
AND time_from < '2013-11-20 18:00'
ORDER BY time_from) e
JOIN (SELECT @lasttime_to := NULL) init) x
WHERE available_to > DATE_ADD(available_from, INTERVAL 15 MINUTE)
结果:
| AVAILABLE_FROM | AVAILABLE_TO |
|---------------------|---------------------------------|
| 2013-11-20 09:15:00 | November, 20 2013 11:00:00+0000 |
| 2013-11-20 11:30:00 | November, 20 2013 12:00:00+0000 |
| 2013-11-20 12:45:00 | November, 20 2013 16:30:00+0000 |
这里应该有另一行来自 2013-11-20 17:15
至2013-11-20 17:45
最佳答案
如果我理解正确的话,您将从预订中进行选择,以获取开放时段的开始和结束时间。问题是所有时间段的端点不在您的数据库中(如果我理解正确,最后一个时间段应该是 2013-11-20 17:15
到 2013- 11-20 18:00
,对吗?)。
有点难看,但将端点添加为约会似乎可行。
SELECT Available_from, Available_to
FROM (
SELECT @lasttime_to AS Available_from, time_from AS Available_to, @lasttime_to := time_to
FROM (SELECT time_from, time_to
FROM bookings
WHERE time_to >= '2013-11-20 08:59'
AND time_from < '2013-11-20 22:01'
UNION ALL
SELECT '2014-11-20 18:00', '2014-11-20 18:00'
ORDER BY time_from
) e
JOIN (SELECT @lasttime_to := NULL) init) x
WHERE Available_to > DATE_ADD(Available_from, INTERVAL 15 MINUTE)
关于mysql - 从 MySQL 中的预订表获取所有可用时段范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023506/