1

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

到目前为止效果很好,但我们最近从 1860 年代获得了数据,当导致时间 < 1901 的值(给或取)时,以下代码不再有效:

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 存在问题。

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

4

3 回答 3

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 分量分离出来,将整天相加,然后取余数,以更高的精度相加

于 2010-05-19T00:32:49.190 回答
1

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

于 2020-04-13T09:07:47.580 回答
0

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

于 2010-05-18T22:40:37.960 回答