2012-02-04 127 views
1

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

重要:

有效日期和结束日期的情况可以有两种通用的方式来实现。

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

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

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

情景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

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

+0

您是否试图查看某个日期是否在给定范围内(可能是开放式的)或者您是否试图查看一个范围是否在另一个范围内? – 2012-02-04 18:47:54

回答

2

我提出的示意​​性图像关于参考间隔,这可能是开放式的(梯度),并且一个时间跨度进行比较:

schematic image

  • 5个基本例AE没有开放的结局。让我们考虑一下比较不是开始时的开放时间。

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

从基本情况看,它们总是重叠,除了sample.end是< reference.start或sample.start> ref.end。

谁会想到这很容易?

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

这很简单,不是吗?

  • 现在我们变得困难了:如果样本是开放式的,什么?案例a现在会重叠,但不会受到影响。

  • 性交经验:两个日期都是开放式的:然后发生重叠。

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

相关问题