复杂的MySQL查询 - 检查重叠的DATE间隔

时间:2015-12-21 23:20:11

标签: php mysql date intervals

我正在尝试编写一个函数来移动计划任务。时间表不能与任何其他事件重叠。我的用户输入如下:

  • schedule_id(int)
  • new_start_time(DATETIME)

我的表格结构如下:

https.default.protocol=TLS
https.socket.protocols=TLSv1

用户在Schedules | schedule_id | start_time | end_time | task_id | 1 | 2015-12-21 02:00:00 | 2015-12-21 04:00:00 | 1 | 2 | 2015-12-21 08:30:00 | 2015-12-21 09:30:00 | 1 | 3 | 2015-12-22 01:00:00 | 2015-12-22 02:00:00 | 2 Tasks | task_id | name | max_duration | 1 | do things | 2 | 2 | do stuff | 1 start_time之间启动"任务"。用户无法开始"任务"直到那个窗口。一旦该用户开始执行任务,他们就拥有该任务ID的end_time来完成任务。还有一个15分钟的窗口可以设置下一个任务。这意味着在窗口结束前1秒启动任务的用户仍有max_duration的时间来完成任务。因此"实际窗口"在max_duration到{start_time + end_time + max_duration)中无法安排任何内容。我想移动一个事件(或插入一个新事件)但我必须检查重叠。基本上我必须确保:

  • 来自用户输入的15是否会遇到任何其他时间表start_time + end_time + max_duration
  • 15 + end_time + 15是否会遇到任何其他时间表max_durationstart time只需获取新end_time并添加原始持续时间start_time =(end_time - orig_end_time)+ orig_start_time

例如,上表对schedule_id的1和2有效,因为用户可以在2:00到4:00之间的任何时间开始。假设他在3:59:59结束时开始,事件将持续到最大5:59:59。即使清理窗口为15分钟,这仍然会导致6:14:59,并且由于下一个时间表从8:30开始,这是可以的。

我已经把头缠了好几个小时。我想在纯MySQL中做到这一点,但我正在考虑使用PHP,如果我真的需要。即使在PHP中,这个问题似乎也很难。当然,我可以抓住每个时间表,提前一两天开始时间,一天或两天结束时间,然后比较我的间隔,但这似乎非常hacky。

有什么想法吗?

0 个答案:

没有答案