Java:使用开放结束日期检查日期范围

时间:2012-02-04 18:43:06

标签: java date

在开放结束日期即可选结束日期的情况下,比较日期范围的最有效方法是什么?我想比较用户给出的生效日期和可选结束日期与数据库中任何现有的重叠生效日期和可选结束日期。如果它们重叠,我想显示错误消息。生效日期是必需的,结束日期是可选的。

重要的:

有效和结束日期的情况可以通过两种一般方式实施。

1)将结束日期作为DB列 例如,抵押或储蓄账户利率。该速率在某个时间点生效,然后保持有效直到下一个速率生效并结束先前的速率效果。在给定的时间点,至少有一个记录将生效。

2)在数据库中没有结束日期 例如,折扣,联谊,促销或特别优惠。这些都可以变得有效并在某个时间点结束。有可能在给定时间没有特别优惠或折扣正在运行。

方案1易于实施。每次插入或编辑记录时,都必须检查数据库中是否存在具有完全相同生效日期(和时间)的等效记录。

场景2可能还有两种风格。

2.1)始终需要结束日期。(用户输入或默认为9999年) 在这种情况下,如果您发现任何记录(start1< = end1和start2< = end2),那么您就有重叠。

2.2)结束日期是可选的,在这种情况下,null表示正无穷大。用户可以输入结束日期或将其留空。 验证更多可能的组合可能很棘手。您可能需要根据用户是否给出结束日期动态生成查询

if(userEnd != null) {
  query.append(dbStart<=userEnd)
}
query.append(dbEnd is null || dbStart>=userStart && dbEnd>=userStart)

如果此查询找到任何结果,那么您将覆盖范围。如果您要求在前一个记录的结束日期为空时自动结束前一个记录,则更进一步,那么您可能需要修改上面的查询,如下所示,以通过验证。

if(userEnd != null) {
  query.append(dbStart<=userEnd)
}
query.append((dbEnd is null && dbStart>=userStart) || (dbStart>=userStart && dbEnd>=userStart))

根据其他要求,您可能需要deleteDate来标记记录无效。可能的组合可以是

生效日期(必填)|删除日期(可选)

OR

生效日期(必填)|结束日期(必填或可选)|删除日期(可选)

1 个答案:

答案 0 :(得分:2)

我制作了一个关于参考区间的示意图,可能是开放式(渐变),以及需要比较的时间跨度:

schematic image

  • 5个基本情况a-e没有开放端。让我们考虑在开始时比较不开放的时间跨度。

让我们进一步定义,没有两个日期完全匹配 - 也许是因为它们是以微秒为单位测量的。这并不重要,因为你只需从&lt;无论您认为什么是有效的假设,都要&lt; =或不。

从基本情况看,它们总是重叠,除了sample.end是&lt; reference.start或sample.start&gt; ref.end。

谁能想到这么容易?

  • 好吧 - 让我们看看,如果ref.end打开会发生什么。案例a不受影响,但案例e也会重叠。

这很简单,不是吗?

  • 现在我们变得困难:如果样品是开放式的,那该怎么办?案例a现在将重叠,但不受影响。

  • 铁杆经验:两个日期都是开放式的:然后出现重叠。

结论:如果有疑问,请做一个图像。这是inkscape。