2016-05-23 61 views
0

我必須從當前(SYSDATE)和修改時間計算以分鐘爲單位的時間差: -甲骨文:日期時間的減​​法運算

to_date(to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') 
- to_date(to_char(modified, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') 

但問題是TO_CHAR返回正確的時間: -

to_char(whenmodified, 'YYYY-MM-DD HH24:MI:SS') 

輸出2016-05-23 14:55:50

TO_DATE不顯示時間: -

to_date(to_char(modified, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') 

輸出:2016-05-23

請幫助我如何能夠通過轉換TO_CHAR爲to_date獲得時間差。

注:

  1. 我不能做SYSDATE改性因爲這兩個SYSDATE和修改日期給出無時間如2016年5月23日

  2. 使用了SYSDATE TO_CHAR或修改給予日期時間2016-05-23 14:55:50

  3. 由於我們不能減去to_char函數中的日期,我再次將它們轉換回to_date以獲得時間。

我期待: 2016年5月23日14點55分50秒 - 2016年5月23日14點53分五十秒= 2分鐘

+2

和'修改'爲文本,然後再回來? –

+2

你不能只是做sysdate修改? – cableload

+0

不,因爲系統日期或修改只是給出日期,但沒有時間戳 – nilFi

回答

3

我必須計算在幾分鐘的時間差從電流(SYSDATE)和改性時間

甲骨文設置

CREATE TABLE table_name (modified DATE); 

INSERT INTO table_name 
SELECT TIMESTAMP '2016-05-23 14:20:00' FROM DUAL UNION ALL 
SELECT TIMESTAMP '2016-05-23 00:00:00' FROM DUAL UNION ALL 
SELECT TIMESTAMP '2016-05-01 00:00:00' FROM DUAL UNION ALL 
SELECT TIMESTAMP '2016-01-01 00:00:00' FROM DUAL; 

查詢

SELECT (sysdate - modified) * 24 * 60 AS minute_difference 
FROM table_name; 

輸出

MINUTE_DIFFERENCE 
----------------- 
     3.66666667 
     863.666667 
     32543.6667 
     206783.667 

,並解決您的評論是:

TO_DATE不顯示時間

日期總是有一個時間組件從來沒有有一個數據庫內部的格式(它由7 or 8 bytes表示) - 日期的格式是由您用來訪問數據庫的客戶端程序完成的通常默認不顯示時間分量 - 但是,時間分量仍然存在)。

你可以改變這個無論是在您的客戶端程序的喜好或者,如果他們不使用它來控制它,通過改變NLS_DATE_FORMAT會話參數:你爲什麼要轉換`sysdate`

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 
+0

不確定是什麼它確切地說,我正在處理prod數據。我是否需要運行ALTER SESSION SET NLS_DATE_FORMAT ='YYYY-MM-DD HH24:MI:SS';在運行我的選擇查詢之前?如果影響其他任何事情,請讓我知道 – nilFi

+0

,重要的是我只讀數據庫 – nilFi

+0

@nilFi:正如MT0所說:日期確實是一個日期時間,您可以根據自己的願望在您的應用程序,當你想要顯示它。 (我想有一個應用程序,因爲你說你正在讀取生產數據。)如果你使用的應用程序使用Oracle設置NLS_DATE_FORMAT來顯示日期時間,並且你不能更改該設置,那麼你可以使用TO_CHAR來指定您的查詢中所需的格式。你已經知道這個功能。 –