在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以number类型存储到数据库中
在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以number类型存储到数据库中,在某些时候方便比较,同样,有些时候我们需要把这种毫秒数转换成标准的timestamp类型,现在总结了两种实现方法:
方法一:
select to_timestamp('1970-01-01 00:00:00.000','yyyy-mm-dd hh24:mi:ss.ff3')+1397457489296/1000/60/60/24 from dual;
这种方法最简单,采用天数相加的方式,效率是比较高的,但是经测试,会丢失毫秒部分的精度,如果对毫秒级精度没有要求,,可以采用这种方式。
方法二:
这种方法比较复杂,通常需要创建一个函数,但是可以精确保留毫秒级精度!
create or replace function milliseconds2timestamp(i_milliseconds number)
/***************************************************************************************
名称:milliseconds2timestamp
功能:将1970-01-01 00:00:00以来的毫秒数转换为对应的timestamp时间类型,精确保留毫秒级精度!
参数:i_milliseconds number 待转换的毫秒数
示例:select milliseconds2timestamp(1397457489296) from dual;
*************************************************************************************/
return timestamp as
v_timestampstr varchar2(17);
begin
select to_char(to_timestamp('1970-01-01', 'yyyy-mm-dd') +
trunc((i_milliseconds -
(mod((i_milliseconds -
(mod((i_milliseconds -
mod(i_milliseconds, 1000)) / 1000,
60) * 1000 + mod(i_milliseconds, 1000))) / 1000 / 60,
60) * 60 * 1000 +
mod((i_milliseconds - mod(i_milliseconds, 1000)) / 1000,
60) * 1000 + mod(i_milliseconds, 1000))) / 1000 / 60 / 60 / 24),
'yyyymmdd') ||--日期
lpad(mod((i_milliseconds -
(mod((i_milliseconds -
(mod((i_milliseconds - mod(i_milliseconds, 1000)) / 1000,
60) * 1000 + mod(i_milliseconds, 1000))) / 1000 / 60,
60) * 60 * 1000 +
mod((i_milliseconds - mod(i_milliseconds, 1000)) / 1000,
60) * 1000 + mod(i_milliseconds, 1000))) / 1000 / 60 / 60,
24),
2,
0) || --小时
lpad(mod((i_milliseconds -
(mod((i_milliseconds - mod(i_milliseconds, 1000)) / 1000,
60) * 1000 + mod(i_milliseconds, 1000))) / 1000 / 60,
60),
2,
0) || --分钟
lpad(mod((i_milliseconds - mod(i_milliseconds, 1000)) / 1000, 60),
2,
0) || --秒
lpad(mod(i_milliseconds, 1000), 3, 0) --毫秒
into v_timestampstr
from dual;
return to_timestamp(v_timestampstr, 'yyyymmddhh24missff3');
exception
when others then
return null;
end;
本文永久更新链接地址: