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

Oracle中,将毫秒数转换为timestamp类型的两种方法的更多相关文章

  1. Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法

    在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...

  2. PyQt(Python+Qt)学习随笔:QTableWidget中表格各列平均分配宽度的两种方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTableWidget表格部件中,如果需要实现表格中各列要占满部件中的可用空间,同时实现各列平分 ...

  3. 怎么在CAD中测量图纸距离?来看看这两种方法

    在CAD中设计图纸最重要的就是图纸的尺寸,俗话说也就是图纸间的距离.通过正确的数据设计出的图纸才能够准确,也能够避免施工时事不必要的误差.那怎么在CAD中测量图纸距离呢?具体要怎么来进行操作呢?下面我 ...

  4. JavaScript中判断对象是否属于Array类型的4种方法及其背后的原理与局限性

    前言 毫无疑问,Array.isArray是现如今JavaScript中判断对象是否属于Array类型的首选,但是我认为了解本文其余的方法及其背后的原理与局限性也是很有必要的,因为在JavaScrip ...

  5. C++多字节字符转换为宽字符的两种方法

    目前知道有两种方式:可以提供宽字符与ANSI字符之间的转换, 第一种由COM库提供的函数 char*  _com_util::ConvertBSTRToString(BSTR ); BSTR _com ...

  6. 在javaScript中把非数值类型的数据自动转换为数值类型的两种方式

    一.使用Number()函数. 二.使用parseInt()/parseFloat()函数. 详情: 一.使用Number()函数将非数值类型的数据自动的转化为数组类型 Number()函数可以将任何 ...

  7. Java 中转换为String类型的四种方法

    1. 使用 String 的构造方法,用于 byte[], char[], StringBuffer, StringBuilder 类型 2. 使用 String 的静态方法 valueOf() 推荐 ...

  8. java中char类型转换成int类型的两种方法

    方法一: char ch = '9'; if (Character.isDigit(ch)){ // 判断是否是数字 int num = Integer.parseInt(String.valueOf ...

  9. 将网址url中的参数转化为JSON格式的两种方法

    在我们进入主题前,我先先看下获取网址URL的方法: window.location.href // 设置或获取整个URL为字符串 window.location.hash // 设置或获取href属性 ...

随机推荐

  1. IBM DB2 控制中心等图形工具在 Windows 下的字体设置

    原文地址(直接看原文): http://loveseaside.iteye.com/blog/648941 [简介如下] IBM DB2 在版本 8.0 以上就提供了一个跨平台的基于 Java 的一套 ...

  2. iOS-跨界面传值和跨应用传值

    跨界面传值 从一个界面将一个结果值传到另一个界面,这个是我们在开发过程中非常常见的一个问题.传值本身并不是一个太复杂的问题,在此主要简述一下常用的传值方法. 我们传值常用的方法主要有四种: 1.属性传 ...

  3. canvas 转化为 img

    ]; var image = new Image(); image.src = c.toDataURL("image/png"); $("#qrcode canvas&q ...

  4. element-ui 的input组件 @keyup.enter事件的添加办法

    <el-input placeholder="请输入密码" type="password" @keyup.enter.native="login ...

  5. 使用 Spring Boot 2.0 + WebFlux 实现 RESTful API

    概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ...

  6. hdu 1979 剪枝暴搜

    Fill the blanks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. 标准C程序设计七---67

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  8. idea http请求的插件(测试接口方便)

    http://blog.csdn.net/winter_chen001/article/details/77249029

  9. JS快速上手-基础Javascript

    1.1背景 1.1.1 ECMAScript与javascript ECMAScript是javascript的官方命名.因为java已经是一个商标.如今,一些早前收到过授权的公司,如Moailla, ...

  10. k8s之nginx-ingress、 Daemonset实现生产案例

    上一篇中用node ip + 非80端口,访问k8s集群内部的服务.实际生产中更希望用node ip + 80端口的方式,访问k8s集群内的服务. # 修改mandatory.yaml中创建控制器部分 ...