【问题标题】:Find Date and Time clashes查找日期和时间冲突
【发布时间】:2016-07-23 13:11:40
【问题描述】:

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

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,但它们处理的是多天重复发生的事件。

我需要确保资源是否在 07-23-2016 到 07-29-2016 的 8:50 到 22:00 之间被预订;有人试图在 2016 年 7 月 25 日至 2016 年 7 月 25 日 08:00 至 08:30 预订,因此无法预订,因为它已被预订一空。经过多次搜索后,我似乎找不到这个公式,任何人都可以帮助发布算法或向我发送指向现有答案的链接,因为它让我发疯。

【问题讨论】:

  • 为什么 8:00 到 8:30 的预订与 8:50 到 22:00 的预订会发生冲突?
  • 如果有人在 2016 年 7 月 23 日 8:50 预订了一辆小巴旅行,并在 2016 年 7 月 29 日 22:00 将其退回,那么如果有人尝试预订2016 年 7 月 25 日 8:00 至 8:30 小巴将不可用。
  • 好的,所以这些不是复杂的重复,它们只是简单的间隔。在那种情况下,您不能只结合日期和时间来创建日期时间并使用正常的重叠比较吗?在大多数编程语言中,将日期时间存储为两个单独的值是不常见的。

标签: algorithm


【解决方案1】:

你能试试下面的逻辑吗?

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

案例一

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

result - 这种情况会失败; @上面代码中的第 16 行

案例 2

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

result - 这种情况会通过;上面代码中的@line 05

案例 3

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

result - 这种情况会通过; @上面代码中的第 11 行

案例 4

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

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

请检查并让我知道在任何情况下上述逻辑是否会给出正确答案。

【讨论】:

  • 谢谢,我认为从我所做的基本测试来看,逻辑工作正常。我会在早上再做几个测试并标记为正确答案。
  • 当然。但是,您也可以考虑@IanMercer 给出的建议。除非您的底层设计本身将日期和时间作为不同的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多