【发布时间】: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 来标记记录无效。可能的组合可以是
生效日期(必填) |删除日期(可选)
或
生效日期(必填) |结束日期(必填或选填) |删除日期(可选)
【问题讨论】:
-
您是要查看一个日期是否在给定范围内(可能是开放式的),还是要查看一个范围是否在另一个范围内?