【发布时间】:2013-10-22 22:07:15
【问题描述】:
租赁系统使用预订表来存储所有预订和预订:
booking | item | startdate | enddate
1 | 42 | 2013-10-25 16:00 | 2013-10-27 12:00
2 | 42 | 2013-10-27 14:00 | 2013-10-28 18:00
3 | 42 | 2013-10-30 09:00 | 2013-11-01 09:00
…
假设用户想要从 2013 年 10 月 27 日 12:00 到 2013 年 10 月 28 日 12:00 租用项目 42,即 1 天。系统会告诉他,该项目在给定的时间范围内不可用,因为没有预订。 2 次碰撞。
现在我想建议所选项目再次可用时的最早租赁日期和时间。当然要考虑用户请求的时间段(1 天),从用户希望的日期和时间开始。
因此,在上述情况下,我正在寻找一个返回 2013-10-28 18:00 的 SQL 查询,自 2013-10-27 12:00 以来的最早日期,此时项目 42 将可用于 1天,从 2013 年 10 月 28 日 18:00 到 2013 年 10 月 29 日 18:00。
所以我需要找到预订之间的差距,它足以容纳用户的预订,并且尽可能接近所需的开始日期。
或者换句话说:我需要找到给定项目的第一个预订,之后有足够的空闲时间来放置用户的预订。
这是否可以在纯 SQL 中实现,而无需遍历每个预订及其后继?
【问题讨论】:
-
“尽可能接近所需的开始日期。”这是否真的意味着“尽快在或之后所需的开始日期/时间?”
-
@OllieJones 这意味着尽快在所需的日期/时间之后。
-
预订系统通常具有定义的粒度,您的情况是这样吗? (预订时间是否必须精确到小时,或者可能允许分钟,但只能是 15 的倍数?12:00、12:15 等?)
-
@MatBailie 在我的情况下,预订时间总是准确的时间。所以最短租期是从 XX:00 到 YY:00 的一小时。
标签: mysql sql gaps-and-islands