Oracle 11g中的TIMESTAMPDIFF?

时间:2015-10-30 15:54:20

标签: oracle oracle11g timestamp

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

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

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

我在TIMESTAMPDIFF上收到无效的标识符错误。此功能在Oracle 11g中不可用吗?或者这是我的DBA需要配置的东西?

2 个答案:

答案 0 :(得分:2)

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之间的区别。

答案 1 :(得分:1)

我从未遇到过TIMESTAMPDIFF,但你可以通过简单地将常规数学运用到你的日期值来完成类似的事情:

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