在开放结束日期的情况下比较日期范围的最有效方法,即可选结束日期?我想比较用户给出的生效日期和可选结束日期与数据库中现有的重叠生效日期和可选结束日期。如果它们重叠,我想显示错误消息。生效日期是必需的,结束日期是可选的。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
生效日期(必需)|结束日期(必需或可选)|删除日期(可选)
您是否试图查看某个日期是否在给定范围内(可能是开放式的)或者您是否试图查看一个范围是否在另一个范围内? – 2012-02-04 18:47:54