zoukankan      html  css  js  c++  java
  • Oracle中,将毫秒数转换为timestamp类型的两种方法

    在许多场景中,开发人员习惯用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;

  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/zzjhn/p/5057137.html
Copyright © 2011-2022 走看看