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

标签 java date

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

重要:

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

1) 通过将结束日期作为数据库列 例如,抵押贷款或储蓄账户利率。该费率在某个时间点生效,然后一直有效,直到下一个费率生效并结束上一个费率的影响。在给定时间点至少有一条记录生效。

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 将记录标记为无效。可能的组合可以是

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

或者

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

最佳答案

我制作了一个关于引用区间的示意图,该引用区间可能是开放式的(梯度),以及要比较的时间跨度:

schematic image

  • 5 个基本情况 a-e 没有开放式。让我们考虑比较一开始就没有开放式结局的时间跨度。

让我们进一步定义,没有两个日期完全匹配 - 也许是因为它们以微秒为单位。这并不重要,因为无论您认为是一个有效的假设,您都会从 < 切换到 <= 或不切换。

从基本情况来看,它们总是重叠的,除了sample.end是ref.end。

谁会想到这么容易?

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

这很简单,不是吗?

  • 现在我们遇到了困难:如果样本是开放式的怎么办?情况 a 现在将重叠,但 e 不受影响。

  • 硬核体验:两个约会都是开放式的:然后发生了重叠。

结论:如果有疑问,请制作图像。这是inkscape。

关于Java:日期范围检查与开放结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9143396/

相关文章:

mysql - 将天数添加到 mysql 日期时间行

java - 使用 SimpleDateFormat.parse() 时获取错误数据

java - IntelliJ IDEA 在里面运行东西时使用了错误的 $JAVA_HOME,我无法更改它

java - 在 Struts 2 中通过请求传递上下文参数

java - 这个 android java 文件中的这些数字是什么?

php - 检查字符串是否会在 PHP 中转换为日期

java - 使用 Ant 的类路径、编译和运行?

java - 我需要用户以一种格式输入时间,将其转换为另一种格式,执行计算,然后再次将其返回

javascript - Ajax 以 dd/mm/yyyy 格式获取日期

mysql - 不同季节的酒店房价