【问题标题】:Long to timestamp for historic data (pre-1900s)历史数据的时间戳很长(1900 年代之前)
【发布时间】:2010-05-18 22:36:41
【问题描述】:

我有一个开始和停止时间的数据库,以前都有相当新的数据(从 1960 年代到现在),我已经能够将其存储为长整数。这与 unix 时间戳非常相似,只有毫秒精度,所以像 java.util.Date.getTime() 这样的函数将是当前时间的值。

到目前为止,这运行良好,但我们最近从 1860 年代获得了数据,当导致时间

to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') + numtodsinterval(int_to_convert/(1000),'SECOND' );

尝试以毫秒为单位的值(例如 -2177452800000)会导致一些问题,例如返回时间戳为 2038 年的日期。有没有办法解决这个问题?我查看过的所有文档和时间戳都应该能够处理到 -4000 (BC) 的年份,所以我怀疑 numtodsinterval 存在问题。

任何想法建议将不胜感激。

【问题讨论】:

    标签: oracle timestamp long-integer


    【解决方案1】:

    这样的事情怎么样:

    select to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') +
             numtodsinterval(val /(1000*60*60*24),'DAY' ) +
             numtodsinterval(
               ((val /(1000*60*60*24)) - (trunc(val /(1000*60*60*24))) ) * 60*60*24,'SECOND')
    from (select -2177452812340 val from dual);
    

    分离出 DAY 部分并添加整个天数,然后取余数并以更高的精度添加它

    【讨论】:

    • 感谢您的回复!这给了我正确的时间戳信息。仍然好奇为什么其他方式不起作用,但再次感谢。
    • 只是为了跟进,我得到了一些时间差异,最终删除了第二个 numtodsinterval 添加,这给了我正确的答案:return to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') + numtodsinterval(val /(1000*60*60*24),'DAY' );以下答案中的精度问题可能是由“to_date”而不是“to_timestamp”引起的。
    【解决方案2】:

    SELECT to_date('01011970', 'DDMMYYYY')+1586707435919/86400/1000 FROM 双

    【讨论】:

      【解决方案3】:

      怎么样 select to_date('01-JAN-1970','DD-MON-YYYY') + ( -1111111111 / (60 * 60 * 24*1000) ) from dual; 这就是我用来将 Java 毫秒转换为日期的方法。

      【讨论】:

      • 自 1970 年 1 月 1 日以来,'int_to_convert' 以毫秒为单位。除以 60*60^24 会失去我需要保留的所有精度。 int_to_convert 是以毫秒为单位存储在我的数据库中的数字,我只是想要一种将这些长值显示为时间戳的方法,该时间戳也适用于 1900 年之前的值。
      猜你喜欢
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2020-07-04
      相关资源
      最近更新 更多