2011-03-15 84 views
1

我有两个时间戳,即开始= 15-03-11 15:10:10和完成= 15-03-11 15:10:10我需要减去它们( “完成 - 开始”)以找到持续时间。因为它们的差别是纳秒级别的,所以我需要分别将它们转换为15:10:10.000000001和15:10:10.000000015。PL SQL:如何显示纳秒的TIMESTAMP

+0

这可能有助于了解您使用的Oracle版本。 – 2011-03-15 21:14:30

回答

3

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

0

版本,平台

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

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

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

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

数据类型

如果你的数据库平台管理十亿分之一秒(为马克已经指出),可以为数据类型使用:TIMESTAMP(9)和间隔(时间量 )间隔时间为秒(9)。

0

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

例如,将它们存储为varchar2并编写您自己的会话例程。如果你必须走这条路线,对你的计算需要考虑的日常滚动等事情心存感激。

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