Java和Oracle都有一个名为Date 的时间戳类型.开发人员倾向于操纵这些,就好像它们是日历日期一样,我看到它会导致令人讨厌的一次性错误.
对于基本日期数量,您可以在输入时简单地切断时间部分,即降低精度.但如果您使用日期范围(例如:9/29-9/30),则这两个值之间的差异是1天,而不是2.此外,范围比较需要1)截断操作:start < trunc(now) <= end
或者2)算术:start < now < (end + 24hrs)
.不可怕,但不是干.
另一种方法是使用真正的时间戳:9/29 00:00:00 - 10/1 00:00:00.(午夜到午夜,因此不包括10月的任何部分).现在持续时间本质上是正确的,范围比较更简单:start <= now < end
.对于内部处理来说当然更干净,但是在初始输入(+1)时需要转换结束日期,对于输出(-1),假定用户级别的日历日期隐喻.
你如何处理项目的日期范围?还有其他选择吗?我特别感兴趣的是如何在Java和Oracle方面处理这个问题.
这是我们如何做到的.
使用时间戳.
使用半开间隔进行比较: start <= now < end
.
忽略那些坚持认为BETWEEN对SQL成功至关重要的抱怨者.
有了这个,一系列日期范围真的很容易审核.数据库值9/30 to 10/1
包含一天(9/30).下一个间隔的开始必须等于前一个间隔的结束.该interval[n-1].end == interval[n].start
规则对审计很方便.
当您显示,如果你愿意,你可以显示格式化start
和end
-1.事实证明,你可以教育人们理解"结束"实际上是规则不再真实的第一天.因此"9/30至10/1"表示"有效启动9/30,不再有效启动10/1".