【问题标题】:Java: Date range check with open end dateJava:开放结束日期的日期范围检查
【发布时间】:2012-02-04 18:43:06
【问题描述】:

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

重要:

生效和结束日期情况可以通过两种通用方式实现。

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

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

场景 1 很容易实现。每次插入或编辑记录时,您都必须检查 db 中没有具有完全相同的生效日期(和时间)的等效记录。

场景 2 可能有另外两种风格。

2.1) 始终需要结束日期。(用户输入或默认为 9999 年) 在这种情况下,如果您发现任何具有 (start1

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

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

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

【问题讨论】:

  • 您是要查看一个日期是否在给定范围内(可能是开放式的),还是要查看一个范围是否在另一个范围内?

标签: java date


【解决方案1】:

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

  • 5 个基本案例 a-e 没有开放式结尾。让我们考虑比较开始时不开放的时间跨度。

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

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

谁能想到这么简单?

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

这很容易,不是吗?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2019-12-16
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多