2015-10-30 231 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;