如何存储日期范围,实际上是时间戳

Chr*_*Noe 7 java architecture oracle types date-range

Java和Oracle都有一个名为Date 的时间戳类型.开发人员倾向于操纵这些,就好像它们是日历日期一样,我看到它会导致令人讨厌的一次性错误.

  1. 对于基本日期数量,您可以在输入时简单地切断时间部分,即降低精度.但如果您使用日期范围(例如:9/29-9/30),则这两个值之间的差异是1天,而不是2.此外,范围比较需要1)截断操作:start < trunc(now) <= end或者2)算术:start < now < (end + 24hrs).不可怕,但不是.

  2. 另一种方法是使用真正的时间戳:9/29 00:00:00 - 10/1 00:00:00.(午夜到午夜,因此不包括10月的任何部分).现在持续时间本质上是正确的,范围比较更简单:start <= now < end.对于内部处理来说当然更干净,但是在初始输入(+1)时需要转换结束日期,对于输出(-1),假定用户级别的日历日期隐喻.

你如何处理项目的日期范围?还有其他选择吗?我特别感兴趣的是如何在Java和Oracle方面处理这个问题.

S.L*_*ott 7

这是我们如何做到的.

  1. 使用时间戳.

  2. 使用半开间隔进行比较: start <= now < end.

忽略那些坚持认为BETWEEN对SQL成功至关重要的抱怨者.

有了这个,一系列日期范围真的很容易审核.数据库值9/30 to 10/1包含一天(9/30).下一个间隔的开始必须等于前一个间隔的结束.该interval[n-1].end == interval[n].start规则对审计很方便.

当您显示,如果你愿意,你可以显示格式化startend-1.事实证明,你可以教育人们理解"结束"实际上是规则不再真实的第一天.因此"9/30至10/1"表示"有效启动9/30,不再有效启动10/1".

  • @Chris Noe:日期时间计算很难.在各种SQL时间表示中,知道关于小数秒(或它们缺乏)的奇怪细节有很多狂妄自大.我更喜欢半开放比较 - 很难出错. (2认同)