我每周安排使用PHP和MySQL编写的应用程序。您可以每天添加约会,例如:
Monday: 06:00 until 12:00
12:00 until 14:00
Tuesday: 08:00 until 12:00
12:00 until 18:00
etc
我的(连接的)架构/表格是:
ID (int11)
eventName (String)
dtStart (timestamp)
dtEnd (timestamp)
此功能现在正在运行,但对于我正在处理的特殊功能,我需要检测是否有任何时间在一周/天中没有安排预约("空闲时间&# 34;)因为这是不可取的(目标是至少有一件事安排在一周的每一分钟,但约会/事件也可能重叠)。我使用mySQL作为数据库,预约开始日期和结束日期作为mySQL时间戳。
起初我以为我可以花费每个预定活动的时间(12:00 - 06:00 = 6小时)并将它们全部加起来以查看totalHours - (24 * 7)= 0。
但首先,这并没有发现差距在哪里,其次,因为事件可以重叠,所以非常不可靠。
有没有以合理的方式检测到这一点?
答案 0 :(得分:0)
首先......考虑数据的粒度......数据的最短时间是什么?分钟?秒?这里要小心:过多的粒度可能会杀死你的服务器......一旦你得到它,请尝试远离mysql来完成这项任务。
我会怎样走?适合任务的小类php:
class Data
{
private $begin;
private $end;
public function __construct($b, $e)
{
$this->begin=$b;
$this->end=$e;
}
public function overlaps_with(Data $d)
{
//Small logic here... The easiest way to assert that something overlaps is to check that it doesn't, then negate the results. Remember, check for self overlapping!!!. If $d and $this are the same you should react accordingly.
}
public function merge_with(Data $d)
{
//Set begin and end to the earliest and latest among $d and $this.
}
};
获取给定日期的所有数据并使用它创建数据实例,填充容器。按开始时间排序。迭代所有这些,并且对于每一个,如果使用overlapps_with,则合并,处理比较的条目。
一旦迭代了每个项目,理想情况下你只剩下一个条目,它在你的应用程序的限制开始和结束时开始和结束。你有不止一个条目吗?好吧,那里有空闲时间,只需迭代你的容器,并将每个条目的结尾与下一个开始进行比较。
如果你考虑一下,就像把时间表放在纸上,并用一个单一的色调着色,每个条目跟随或跟着另一个。剩下没有的是空闲时间。