查找日期和时间冲突

时间:2016-07-23 13:11:41

标签: algorithm

我很难识别我系统中的预订冲突。我开发了一个与我们的核心系统集成的预订系统。存储在我的预订系统中的列数据是:

ResourceID, StartDate, EndDate, StartTime, EndTime

我需要确保当其他用户尝试预订资源时,资源可用。这个问题已被许多人提出,但通常会有一个日期,开始和结束时间,或者在开始日期和结束日期之间相交。

如果我只想检查交叉日期或时间,则使用的公式为

a=existing_booking
b=new_booking

overlap = a.start < b.end && b.start < a.end;

然后,我发现了一篇关于重叠资源的非常好且有趣的帖子,其中包含开始时间和结束时间Code Logic to prevent clash between two reservations,但它们处理多天重复发生的事件。

我需要确保资源是在2016年7月23日至2016年2月7日8:50至22:00之间预订的;有人试图在2016年7月25日至2016年7月25日08:00至08:30预订,因此无法预订。经过无数次搜索,我无法找到相应的公式,任何人都可以帮助发布算法或向我发送现有答案的链接,因为它让我疯狂。

1 个答案:

答案 0 :(得分:0)

你可以试试下面的逻辑吗?

01  if (new.StartDate > existing.EndDate OR new.EndDate < existing.StartDate) {
02      resource is available for booking
03  } else if (new.EndDate = existing.StartDate AND new.StartDate <= existing.StartDate) {
04      if (new.EndTime =< existing.StartTime OR new.StartTime >= existing.EndTime) {
05          resource is available for booking
06      } else {
07          resource is NOT available for booking
08      }
09  } else if (new.StartDate = existing.EndDate) {
10      if (new.StartTime >= existing.EndTime) {
11          resource is available for booking
12      } else {
13          resource is NOT available for booking
14      }
15  } else {
16      resource is NOT available for booking
17  }

让我们根据具体情况进行检查;
通过 - 资源可用 失败 - 资源不可用

现有预订已到位

ResourceID  | StartDate     | EndDate       | StartTime | EndTime
ID1234      | 07-23-2016    | 07-29-2016    | 08:50     | 22:00

案例1

ResourceID  | StartDate     | EndDate       | StartTime | EndTime
ID1234      | 07-25-2016    | 07-25-2016    | 08:00     | 08:30

结果 - 这种情况会失败;上面代码中的@line 16

案例2

ResourceID  | StartDate     | EndDate       | StartTime | EndTime
ID1234      | 07-23-2016    | 07-23-2016    | 08:00     | 08:30

结果 - 这个案子会通过;上面代码中的@line 05

案例3

ResourceID  | StartDate     | EndDate       | StartTime | EndTime
ID1234      | 07-29-2016    | 07-29-2016    | 22:01     | 22:30

结果 - 这个案子会通过;上面代码中的@line 11

案例4

ResourceID  | StartDate     | EndDate       | StartTime | EndTime
ID1234      | 07-23-2016    | 07-23-2016    | 09:00     | 11:30

结果 - 这种情况会失败;上面代码中的@line 07

请检查并告知我,无论如何,上述逻辑都会给出正确答案。