【问题标题】:Calculate maximum overlapping events within a range in PHP or MySQL在 PHP 或 MySQL 中计算一个范围内的最大重叠事件
【发布时间】:2021-05-05 01:11:58
【问题描述】:

这可能以前被问过,但我的搜索结果不足。想象一个汽车预订系统,我可以在任何给定时间租用三辆汽车。

如何使用 PHP 和 MySQL 5.7 确保在新预订的时间范围内不超过此限制?

我找到了this answer,但我不确定如何解决 MySQL 5.7 不支持窗口函数这一事实。

我可以加载所有冲突的预留并使用 PHP 逐步计算在该间隔内哪些预留冲突并取最大值,但我认为这是一个更好的解决方案的常见问题。

信息

  • 数据库将start_timeend_time 存储为TIMESTAMP 数据类型。
  • 需要从范围开始到结束每隔 1 分钟检查一次。

图表

【问题讨论】:

  • 请从您的表格中发布示例数据
  • 是否有事件的最大长度?

标签: php mysql time overlap schedule


【解决方案1】:

所以要检查一个特定的时刻,你可以这样做:

select count(1) conflicts
from events
where start_time <= desired_time && end_time > desired_time;

要查找所需时间范围内的最大冲突数,您无需每分钟检查一次,只需在每个冲突事件的开始时间(或所需开始时间,如果较晚)检查:

select coalesce(max(conflicts),0) max_conflicts
from (
    select count(1) conflicts
    from (
        select distinct greatest(DESIRED_START_TIME, start_time) desired_time
        from events
        where start_time < DESIRED_END_TIME && end_time > DESIRED_START_TIME
    ) conflicting_events
    join events on start_time <= desired_time && end_time > desired_time
) point_in_time_conflicts;

(未经测试)

【讨论】:

  • 谢谢!我会在看到结果后立即检查并标记答案。我知道必须有一种方法,并且只需要检查开始时间就可以了。一旦你说出来,这似乎很明显,但我没有想到。
  • 所以我永远无法让它工作。将来我可能会花更多时间在它上面,但与此同时,它为我指明了正确的方向,其中一些正在起作用。谢谢你。鉴于即使需要调整,我也认为这是正确的解决方案,因此我将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多