我正在尝试在我的预订系统中获得一系列时间段,并考虑到现有预订和完成时间。 时间间隔为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
答案 0 :(得分:0)
如果我理解正确,您将从预订中进行选择以获得开放时间段的开始和结束时间。问题是所有时间段的端点都不在您的数据库中(如果我理解正确,最后一个插槽应该是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)