Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:具有开放结束日期的日期范围检查_Java_Date - Fatal编程技术网

Java:具有开放结束日期的日期范围检查

Java:具有开放结束日期的日期范围检查,java,date,Java,Date,在开放结束日期(即可选结束日期)的情况下,比较日期范围的最有效方法是什么?我想将用户给定的生效日期和可选结束日期与数据库中任何现有重叠的生效日期和可选结束日期进行比较。如果它们重叠,我想显示错误消息。生效日期是必需的,结束日期是可选的 重要: 有效和截止日期情况可通过两种一般方式实现 1) 通过将结束日期作为DB列 例如,抵押贷款或储蓄账户利率。利率在某个时间点生效,然后保持有效,直到下一个利率生效并结束前一个利率的影响。在给定时间点,至少有一条记录生效 2) 因为数据库中没有结束日期 例如,折

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

重要:

有效和截止日期情况可通过两种一般方式实现

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

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

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

场景2可能还有两种风格

2.1)始终需要结束日期。(用户输入或默认为9999年)
在这种情况下,如果您发现任何记录(start1我制作了一个关于参考间隔的示意图,该间隔可能是开放的(渐变),并且有一个时间跨度进行比较:

    这5个基本情况是没有开放式的。让我们考虑时间段,比较一下不开放的开始。
让我们进一步定义,没有两个日期完全匹配-可能是因为它们是以微秒为单位测量的。这并不重要,因为您将从<切换到ref.end

谁会想到这么简单

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

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

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


结论:如果有疑问,请拍摄一张图片。这是inkscape。

您是想看一个日期是否在给定范围内(可能是开放的),还是想看一个范围是否在另一个范围内?
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))