Oracle ORA-01841,(完整)年份必须介于

Oracle ORA-01841,(完整)年份必须介于,oracle,epoch,Oracle,Epoch,我想把表中的历元日期转换成时间戳 但当我在Oracle中运行它时,它会导致一个错误 但是进入拉布的年份,4月22日2465普库15.35.06.289 GMT+07:00,当我从这个链接运行时 15630394456289509085900 这是表中的历元时间 select to_char( cast( to_date('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')+1563039445628950

我想把表中的历元日期转换成时间戳

但当我在Oracle中运行它时,它会导致一个错误

但是进入拉布的年份,4月22日2465普库15.35.06.289 GMT+07:00,当我从这个链接运行时

15630394456289509085900 这是表中的历元时间

select to_char(
           cast(
               to_date('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')+15630394456289509085900/86400 
           as timestamp with local time zone)
         ,'YYYY-MM-DD HH24:MI:SS') 
from dual

纪元时间位于UTC时区。只需使用时间戳文字并添加正确的秒数:

选择时间戳“1970-01-01 00:00:00 UTC” +NUMTODSINTERVAL1563039445628950909085900/86400e12,“天”作为纪元, 时间戳“1970-01-01 00:00:00 UTC” +NUMTODSINTERVAL1563039445628950909085900/86400e13,“天”作为时代 来自双重 哪些产出:


dbfiddle

显然,您的公式将历元时间解释为秒,而事实上,这个数字看起来像皮秒1/10^12秒。要获得正确的时间,必须除以86400000000000000,也就是说,在分母上再加12个零。请注意,Oracle时间戳仅支持纳秒1/10^9秒,因此您将失去精度。顺便说一句,谢谢您,所以我无法更改纪元日期,因为它太长了?您试图将5e14年添加到1970年,这比Oracle支持的日期中的年要长。跟随@mathguy的注释,您将得到结果,以确保156303944562895050909085900不是Unix时间戳。我的第一个想法是,它可能是LDAP时间戳,从1601-01-01 00:00:00 UTC开始为100纳秒-但是这将导致4950万年,这也是非常不可能的。日期数据类型不包含任何时区信息。当您使用本地时区运行CAST-as-timestamp时,Oracle意味着SESSIONTIMEZONE。验证是否已将其设置为UTC EPOCH_TIME_12 | EPOCH_TIME_13 :-------------------------------- | :-------------------------------- 2465-04-22 08:14:16.289509086 UTC | 2019-07-13 17:37:25.628950909 UTC