【问题标题】:MySQL - Find available time slotsMySQL - 查找可用的时间段
【发布时间】:2017-11-20 23:47:19
【问题描述】:

我正在开发一个预订系统,用户应该可以在其中预订具有不同服务期限的服务。

我已经有一个 MySQL 表,用于存储预订、包含可用时隙的表和返回空闲时隙的查询。

我的bookings 表如下:

point_id     start (datetime)       end (datetime)
1            2017-06-17 14:50:00    2017-06-17 14:59:59
1            2017-06-17 15:10:00    2017-06-17 15:19:59
1            2017-06-17 15:40:00    2017-06-17 15:44:59
2            2017-06-17 15:50:00    2017-06-17 16:04:59
2            2017-06-17 16:05:00    2017-06-17 16:14:59
...

datetimes 表包含 10 分钟间隔:

datetime (datetime)
2017-06-17 14:40:00
2017-06-17 14:50:00
2017-06-17 15:00:00
2017-06-17 15:10:00
2017-06-17 15:20:00
2017-06-17 15:30:00
2017-06-17 15:40:00
...

这里是返回空闲时隙的查询:

SELECT
    a.datetime AS blockstart,
    DATE_ADD(a.datetime, INTERVAL 599 SECOND) AS blockend
FROM
    datetimes a
LEFT JOIN
    (
        SELECT *
        FROM bookings
        WHERE point_id = 1
    ) b ON
        (a.datetime BETWEEN b.start AND b.end)
        OR
        (DATE_ADD(a.datetime, INTERVAL 599 SECOND) BETWEEN b.start AND b.end)
WHERE b.id IS NULL AND a.datetime BETWEEN '2017-06-17 00:00:00' AND '2017-06-17 23:59:59';

如果服务时间少于 25 分钟 - 一切正常。 问题在于持续时间超过 25 分钟的服务 - 我的查询返回与已预订的 10 分钟服务重叠的时段。例如,我从 13:00:00 到 13:09:59 预订,如果我查询间隔 1499 秒,它返回 12:50:00,这将与下一次预订重叠。 谁能帮我解决这个重叠服务的问题?

【问题讨论】:

  • 不,@Evert ,通过您的链接仅显示从 11:00 到 14:20 的时间间隔,但我的查询返回免费的 10 分钟时间间隔,选择其中一个记录客户的时间间隔这个选定的时间。
  • 我不明白....在 datetimes 表中添加 9min 和 59sec...的原因是什么...是为了与 bookings 表进行比较/加入吗?

标签: mysql


【解决方案1】:

您可以找出不可用的时隙,然后与 datetimes 表连接以找出可用的时隙:

SELECT distinct all_slots.`datetime`
FROM datetimes AS all_slots
LEFT JOIN (
  SELECT `datetime`
  FROM datetimes AS d
  JOIN bookings AS b
    ON b.start BETWEEN d.`datetime` AND DATE_ADD(d.`datetime`, INTERVAL 599 SECOND)
    OR b.end   BETWEEN d.`datetime` AND DATE_ADD(d.`datetime`, INTERVAL 599 SECOND)
) AS not_available
ON all_slots.`datetime` = not_available.`datetime`
WHERE not_available.`datetime` is null

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多