PL SQL:如何显示TIMESTAMP的纳秒

时间:2011-03-15 21:07:17

标签: sql oracle plsql timestamp

我有两个时间戳,即start = 15-03-11 15:10:10和finish = 15-03-11 15:10:10我需要减去它们(“完成 - 开始”)才能找到持续时间。因为它们的差异在纳秒级别,我需要将它们分别转换为15:10:10.000000001和15:10:10.000000015。

4 个答案:

答案 0 :(得分:4)

取决于它们的存储方式 - TIMESTAMP列的默认设置仅保留到6个小数位Oracle reference,因此必须将字段声明为TIMESTAMP(9),如果是,那么差异也需要为声明为INTERVAL(9)

答案 1 :(得分:0)

版本,平台

首先,它是关于您的版本和服务器平台的。(阅读OMG小马笔记)。 的为什么吗

  1. 版本? 如果您使用的是早于Oracle 9i的版本,则别无选择,只能使用“Date”数据类型。并且您无法以十亿秒的语言本地管理。

  2. 服务器平台? 时间来自操作系统。如果您的操作系统管理数十亿秒,您将能够以十亿分之的粒度管理“时间戳”。

  3. Esamples: Windows XP或Vista 让您管理十亿分之一秒。

    <强>数据类型

    如果您的数据库平台管理十亿分之一秒(因为 Mark已指出),您可以使用以下数据类型:TIMESTAMP(9)和 INTERVAL(数量时间)间隔天数到秒(9)。

答案 2 :(得分:0)

补充Zep,Mark和OMG小马的答案 - 当然,如果这些值是从其他来源(例如科学设备)加载的,这些来源提供的精确度高于OS / Oracle版本支持的精度,那么您可以根据需要存储和操作这些值。

例如,将它们存储为varchar2并编写自己的转换例程。如果你必须走这条路线,请注意你的计算需要考虑的日翻滚等事项。

答案 3 :(得分:0)

这对我有用。我们的想法是将差异转换为字符串并应用正则表达式来检索时间的适当部分并将该部分转换为纳秒,最后将所有部分相加。我只做了秒(不是小时和分钟),但你明白了。

   /* Formatted on 10/5/2012 5:35:08 PM (QP5 v5.149.1003.31008) */
SELECT TO_NUMBER (
          REGEXP_SUBSTR (TO_CHAR (systimestamp - sysdate),
                         '[0-9]{2}',
                         14),
          '99')
       * 1000000000
       + TO_NUMBER (
            REGEXP_SUBSTR (TO_CHAR ( (systimestamp - sysdate) ),
                           '[0-9]{6}',
                           14),
            '999999')
  FROM dual