您好,欢迎访问一九零五行业门户网

Oracle中将毫秒数转换为timestamp类型的两种方法

在许多场景中,开发人员习惯用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;
本文永久更新链接地址:
其它类似信息

推荐信息