有没有办法如何直接将值以毫秒(例如1480515430991)转换为Oracle TIMESTAMP(6)列?就像TO_TIMESTAMP或TO_DATE函数缺少某些模式一样?
到目前为止,我所能找到的是一些间隔计算和 to_date(' 1970-01-01',' YYYY-MM-DD')或其他疯狂的"手册"计算
由于
修改 多谢你们。我没有问过如何进行转换。我问是否有直接(本地,更直接)的方法来实现它并避免给定输入的这些计算。我只是一个好奇的人,那里有很多无证的功能(Oracle不排除)。我想那不是我的答案。
答案 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;