mysql - 从 MySQL 中的预订表获取所有可用时段范围

标签 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

最佳答案

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

关于mysql - 从 MySQL 中的预订表获取所有可用时段范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023506/

相关文章:

mysql - php 生成的文本和键盘编写的文本看起来相同,但 diff(和 MySQL 查询)有 100% 不同

javascript - 将JSON数据存储在数据库: object could not be converted to string error中

php - 如何为新用户生成安全密码?

php - 表不会更新,但显示成功

mysql - 条件mysql if内连接

MYSQL MyTAP 问题

mysql - SpringBootapp 无法连接 mysql 数据库

mysql选择别名不起作用

php - MySQL 无法连接

php - 抑制 php 上的 mysql 错误