【问题标题】:What is the best way to see if a [time length] is available with rows of reservations?查看 [时间长度] 是否可用于预订行的最佳方法是什么?
【发布时间】:2019-09-16 08:26:34
【问题描述】:

我有以下 SQL 表列:

reservationId - int
startDateTime - datetime
endDateTime - datetime

我的问题是这样的:

我想看看一天中是否有 [time] 段可以满足 [time] 预订。

例如,我正在寻找 6 月 1 日上午 9 点到晚上 9 点的 2 小时预订。

6 月 1 日目前有两个预订:

10am - 2pm
4pm - 6pm

我希望我的查询返回可用于预订的时间。即:

2pm - 4pm
6pm - 8pm
7pm - 9pm

关于如何进行此操作的任何想法?

【问题讨论】:

  • 您是否有可以预订的窗口?请注意,如果您有一个单独的 DATE 列,可用于在查找冲突之前进行过滤,这通常会更容易。它可以被索引并使 MySQL 更容易计算重叠时间。但是,如果您的约会可以延续到第二天,这将不起作用。
  • @tadman 是的,在示例中是 6 月 1 日,上午 9 点 - 晚上 9 点。但这个窗口会有所不同。
  • 哪个版本的 MySQL?
  • 为什么 06:00 到 09:00 和 07:00 到 09:00 而不是 6:30 到 9:30 等?
  • @stickybit 只是想检查每个小时的顶部

标签: mysql sql database date datetime


【解决方案1】:

这不是一个完整的答案,但它应该能让你走到一半:

SELECT o.openingStart, IFNULL(o.openingEnd, '2019-04-26 21:00:00') AS openingEnd
FROM (
    SELECT r.endDateTime AS openingStart
        , (SELECT r2.startDateTime 
           FROM reservations AS r2 
           WHERE r2.startDateTime > r.endDateTime
               AND r2.endDateTime < '2019-04-27 00:00:00'
           ORDER BY r2.startDateTime ASC
           LIMIT 1
        ) AS openingEnd
    FROM ( SELECT startDateTime, endDateTime 
           FROM reservations 
           WHERE startDateTime >= '2019-04-26 00:00:00' 
             AND endDateTime < '2019-04-27 00:00:00'
           UNION
           SELECT '2019-04-26 00:00:00', '2019-04-26 09:00:00'
         ) AS r
) AS o

在此之后,您可能希望仅通过两个小时或更长时间的空缺进行过滤,然后可能需要加入某种静态的小时表,以将较大的空缺扩展到它们可以容纳的较小空缺。

IFNULL实际上可以用在内部查询中,但我认为这样可能会更清晰一些。

注意:那里的所有文字日期时间值都应该可以用适当计算的参数值替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多