将UTC时间戳(毫秒)插入Oracle时间戳列

时间:2016-11-30 14:23:25

标签: sql oracle plsql oracle11g

有没有办法如何直接将值以毫秒(例如1480515430991)转换为Oracle TIMESTAMP(6)列?就像TO_TIMESTAMP或TO_DATE函数缺少某些模式一样?

到目前为止,我所能找到的是一些间隔计算和 to_date(' 1970-01-01',' YYYY-MM-DD')或其他疯狂的"手册"计算

由于

修改 多谢你们。我没有问过如何进行转换。我问是否有直接(本地,更直接)的方法来实现它并避免给定输入的这些计算。我只是一个好奇的人,那里有很多无证的功能(Oracle不排除)。我想那不是我的答案。

3 个答案:

答案 0 :(得分:1)

这是如何从纪元获得时间戳:

select to_timestamp('1970-01-01','yyyy-mm-dd') + ( 1 / 24 / 60 / 60 / 1000) * epoch from dual;

所以在插入中请插入to_timestamp('1970-01-01','yyyy-mm-dd') + ( 1 / 24 / 60 / 60 / 1000) * epoch而不是epoch。您还可以为此创建功能:

create or replace function epoch2timestamp(epoch number) return timestamp as
begin
return to_timestamp('1970-01-01','yyyy-mm-dd') + ( 1 / 24 / 60 / 60 / 1000) * epoch;
end;
/

然后操作功能。这些不是“疯狂的手动计算”,只是一种合法的转换方式。

答案 1 :(得分:1)

正确的功能,即包括时区考虑和毫秒将是这个(使用文字):

create or replace function epoch2timestamp(epoch number) return timestamp as
begin
return (TIMESTAMP '1970-01-01 00:00:00 UTC' + epoch/1000 * INTERVAL '1' SECOND) AT LOCAL;
end;
/

答案 2 :(得分:-1)

如果你想表达unix时间,即epoch之后的时间,你需要秒,而不是毫秒。见Unixtime

Oracle的数据类型TIMESTAMP在几秒钟内完成,您可以在Oracle文档中阅读。 Link zu 11g documentation

  

日期的年,月,日值,以及小时,分钟和秒的时间值,其中fractional_seconds_precision是SECOND日期时间字段的小数部分中的位数。 fractional_seconds_precision的可接受值为0到9.

回答你的问题:有一个TO_TIMESTAMP功能。见11g documentation

  

TO_TIMESTAMP函数将文本数据转换为TIMESTAMP数据类型的值。

您可以像这样使用

TO_TIMESTAMP('2016/11/30 15:53:18', 'YYYY/MM/DD HH:MI:SS')

并且会得到'30 -NOV-16 15.53.18.000000000 AM'

如果由于某种原因,您确实需要显示秒sind时代,则可以使用非疯狂计算

select (SYSDATE - to_date('1970-01-01', 'yyyy-MM-dd')) * 24 * 60 * 60 from dual;