【问题标题】:TIMESTAMPDIFF in Oracle 11g?Oracle 11g 中的 TIMESTAMPDIFF?
【发布时间】:2016-01-31 02:49:21
【问题描述】:

我在 Oracle here 中看到了 TIMESTAMPDIFF 函数的文档,但它提到它是针对“Oracle9i Lite”的。

当我尝试在 Oracle 11g 上使用该示例时:

SELECT TIMESTAMPDIFF(SQL_TSI_DAY, CURRENT_DATE, '1998-12-09') FROM DUAL;

我在 TIMESTAMPDIFF 上收到无效标识符错误。这个特性在 Oracle 11g 中不可用吗?还是我的 DBA 需要配置的东西?

【问题讨论】:

  • 您是否有一个名为 CURRENT_DATE 的列,或者您的意思是使用 SYSDATE?
  • @Mihai:CURRENT_DATE在11g有效。类似于SYSDATE,但对会话时区敏感。
  • 每天学习新东西@Allan

标签: oracle oracle11g timestamp


【解决方案1】:

Oracle RDMBS 中不存在该功能;它显然在 Oracle Lite(我从未遇到过)中做到了,我相信它在 MySQL 等其他数据库中。

有涵盖datetime and interval arithmetic 的文档可以帮助您了解其中的一部分;您可以从另一个中减去一个时间戳;或一个日期与另一个日期,或两者的混合 - 但坚持一种数据类型更简单。根据您使用的方式,您将获得一个间隔或代表天数的数字:

SQL> SELECT CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00' FROM DUAL;

CURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00'
---------------------------------------------------------------------------
+000006169 16:16:21.287166000

SQL> SELECT CURRENT_DATE - DATE '1998-12-09' FROM DUAL;

CURRENT_DATE-DATE'1998-12-09'
-----------------------------
                   6169.67775

如果您只想要整天数,您可以使用 extract() 作为间隔来获取您想要的元素,或者使用 trunc() 作为删除小数部分的数字:

SQL> SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00') FROM DUAL;

EXTRACT(DAYFROMCURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00')
---------------------------------------------------------------
                                                           6169

SQL> SELECT TRUNC(CURRENT_DATE - DATE '1998-12-09') FROM DUAL;

TRUNC(CURRENT_DATE-DATE'1998-12-09')
------------------------------------
                                6169

如果您愿意,您也可以在比较之前trunc() 当前日期,因此您在午夜比较两者,这意味着不会删除小数部分:

SQL> SELECT TRUNC(CURRENT_DATE) - DATE '1998-12-09' FROM DUAL;

TRUNC(CURRENT_DATE)-DATE'1998-12-09'
------------------------------------
                                6169

我已将 ANSI 日期文字用于固定日期,但您可以使用现有的日期或时间戳变量或列;或 to_date()to_timestamp() 如果您有不同格式的字符串。


您还可以使用extract() 将区间的组件转换为组合值as shown here;并确保您了解current_date and sysdate, and the timestamp equivalents 之间的区别。

【讨论】:

    【解决方案2】:

    我从未遇到过 TIMESTAMPDIFF,但您可以通过简单地将常规数学应用于您的日期值来完成类似的操作:

    SELECT CURRENT_DATE - to_timestamp('1998-12-09','yyyy-mm-dd') FROM DUAL;
    

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多