获取MySQL中预订表的所有可用时隙范围

时间:2014-04-11 22:17:43

标签: mysql

我正在尝试在我的预订系统中获得一系列时间段,并考虑到现有预订和完成时间。 时间间隔为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:152013-11-20 17:45

的另一行

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您将从预订中进行选择以获得开放时间段的开始和结束时间。问题是所有时间段的端点都不在您的数据库中(如果我理解正确,最后一个插槽应该是2013-11-20 17:152013-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)