我正在尝试编写一个函数来移动计划任务。时间表不能与任何其他事件重叠。我的用户输入如下:
我的表格结构如下:
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_duration
。 start 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。
有什么想法吗?