2015-10-30 184 views
0

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

当我尝试使用在Oracle 11g中的例子:

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

我得到TIMESTAMPDIFF无效的标识符错误。此功能在Oracle 11g中不可用吗?还是我的DBA需要配置?

+0

您是否有名为CURRENT_DATE的列或者您是否想要使用SYSDATE? – Mihai

+1

@Mihai:'CURRENT_DATE'在11g中有效。它与'SYSDATE'类似,但对会话时区敏感。 – Allan

+0

每天学习新的东西@Allan – Mihai

回答

2

那个函数没有在甲骨文RDMBS存在;它明显在Oracle Lite中(我从来没有遇到过),我相信它在MySQL等其他数据库中。

有关于datetime and interval arithmetic的文档可以帮助您找到其中的一部分;你可以从另一个减去一个时间戳;或来自另一个日期的日期,或两者的组合 - 但坚持一种数据类型更简单。根据你使用,你会要么得到的间隔或代表天数的数字:如果你只是想你可以使用extract()为间隔的整个天数来获得你想要的元素

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 

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

我从来没有遇到TIMESTAMPDIFF,但你可以做到通过简单地应用数学规律类似的东西到你的日期值:

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