Php 查找时间表中的差距

Php 查找时间表中的差距,php,mysql,Php,Mysql,我有一个每周使用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) 这项功能目

我有一个每周使用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)
这项功能目前正在运行,但对于我正在使用的一项特殊功能,我需要检测一周/一天中是否有任何时间没有预约安排的空闲时间,因为这是不可取的目标是每周每分钟至少安排一件事,但约会/活动也可能重叠。我使用mySQL作为数据库,约会开始日期和结束日期作为mySQL时间戳

起初,我想我可以计算每个预定活动所需的时间12:00-06:00=6小时,然后把它们加起来,看看totalHours-24*7=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. 
}
};
获取给定日期的所有数据,并使用它创建数据实例,填充容器。按开始时间对它们进行排序。遍历所有这些项,对于每个项,将_与if重叠_合并,并处理比较的项

迭代完每个项目后,理想情况下只剩下一个条目,当应用程序的限制被取消时,该条目开始和结束。您有多个条目吗?。好吧,那里有空闲时间,只需迭代容器并将每个条目的结尾与下一个行乞进行比较


如果你想一想,这就像把时间表放在纸上,用一种单一的色调给每个条目涂上颜色,每个条目后面或后面都是另一个条目。没有吸引力的是空闲时间。

我们无法从提供的信息中回答这个问题。您还缺少哪些其他信息?真正的问题,我想知道如何改进我的问题askingWell,表模式是朝着正确方向迈出的一步。通常,我会建议以下简单的两步行动:1。p提供适当的DDL和/或SQLFIDLE,以便更容易地复制问题。2.p提供与步骤1中提供的信息相对应的所需结果集。FWIW,我认为MySQL对于此类任务是一个非常好的工具。非常棒的答案,非常有用。我要设法解决这个问题,然后向你汇报!没问题。如果我们能帮忙,请告诉我们@草莓,是的,SQL可以是一个很棒的工具,快速而简洁,但是当涉及到巨大的嵌套查询和过程时,它也会变得丑陋。老实说,我没有想到SQL的答案,只是数据结构和算法有一定的可塑性,可以非常优雅和可读:。