mysql / php中事件的基于时间的资源可用性

时间:2010-06-04 11:55:29

标签: php mysql doctrine

对于事件系统,我需要检查是否有足够的资源可用于事件。事件具有开始和结束时间戳,并且需要许多资源(为了简单起见,我们假设只有一种类型的资源)。当预订新活动时,应该检查是否可能。所有事件都是基于学说的php对象,时间戳不需要比分钟更具体。

我在以下示例中遇到了麻烦:

  • 从12:00到13:00需要1个资源
  • 从13:00到14:00需要1个资源
  • 创建了一个新事件,需要1个资源从12:00到14:00

假设我们共有2个资源,那么这应该是可能的。我目前选择与新事件重叠的所有事件(从12:00到14:00),并获取这些事件所需的所有资源的总和。这意味着新事件是不可能的。

如何(有效地)检查新活动是否可行?要么只使用一个学说查询,要么使用一个学说查询进行基本选择,然后用php进行过滤。到目前为止,我提出的唯一解决方案是:从12:00到14:00选择所有事件,并在资源超额预订时检查每分钟(如此120次迭代)。

1 个答案:

答案 0 :(得分:0)

由于您正在使用时间戳,因此这非常简单。

你会拉出当天的所有活动。然后循环遍历每个事件以查看新事件的时间戳边界是否与现有事件的时间戳边界冲突

$conflict = false;
foreach($arrEvents as $event) {
    if ($newStart >= $existingStart && $newStart < $existingEnd) {
        // The start time falls within this event's time
        $conflict = true;
    } elseif ($newEnd > $existingStart && $newEnd <= $existingEnd) {
        // The end time falls within this event's time
        $conflict = true;
    } elseif ($newStart <= $existingStart && $newEnd >= $existingEnd) {
        // Existing event falls completely within the new event
        $conflict = true;
    }
}

显然,循环所有事件并不是最有效的方法,但这是我过去使用的基本解决方案,效率不是问题