2016-07-23 95 views
0

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

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年7月29日的8:50至22:00之间预订;有人试图预订07-25-2016至07-25-2016在08:00至08:30不能预订,因为它被预订了。经过无数次搜索后,我似乎无法找到这个公式,任何人都可以帮助张贴算法或给我一个链接到现有的答案,因为它驱使我疯了。

+0

为什么从8:00到8:30的预订与8:50到22:00的预订有冲突? –

+0

如果有人在07-23-2016 8:50预订了小型巴士旅行并于07-29-2016 22:00将其返回,那么如果有人试图在07-25-2016在8:00至8:30小巴不可用。 – JK36

+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在上面的代码

请检查并让我知道,如果在任何情况下上述逻辑会给出一个正确的答案。

+0

谢谢,我认为这个逻辑在我完成的基本测试中工作正常。我会在早上做更多的测试,并标记为正确的答案。 – JK36

+0

当然。不过你也可以考虑@IanMercer给出的建议。除非你的底层设计本身具有不同的领域的日期和时间。 –