2009-10-01 55 views
2

我該如何編寫一個表達式,以日期,小時,分鐘,秒等方式給出兩個日期之間的差異?默認情況下,在oracle中減去兩個日期將返回天數作爲分數。Oracle Date Subtraction

回答

4

小數點是提供的兩個日期之間的天數差。你可以做一些小算術,將其轉換成日,時,分,秒等。

編輯:我明白你在找什麼。我敢肯定有一個更簡單的方法,但我想可能正是如此完成它:

select trunc(5.3574585) days, 
     trunc(mod((5.3574585) * 24, 24)) hours, 
     trunc(mod((5.3574585) * 24 * 60, 60)) minutes, 
     trunc(mod((5.3574585) * 24 * 60 * 60, 60)) seconds 
    from dual; 

...其中5.3574585是減法返回的天數...

注:此ISN沒有經過真正的測試,它不在我頭頂。

+0

我選擇了這個答案,因爲它很短,很容易閱讀。讚揚所有答案 - 他們都工作!謝謝大家 – Jeff 2009-10-02 16:20:12

+0

請注意這些數字是浮點數,所以如果您嘗試對結果運行FLOOR函數,您可能會遇到錯誤(10:30:40 - 10:14:40應該恰好爲16分鐘,但日期爲.011(1次重複)。 – 2012-06-07 15:25:08

6

用途:

SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1, 
     TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2, 
     TRUNC(86400*(date2-date1)) - 60*(TRUNC((86400*(date2-date1))/60)) seconds, 
     TRUNC((86400*(date2-date1))/60) - 60*(TRUNC(((86400*(date2-date1))/60)/60)) minutes, 
     TRUNC(((86400*(date2-date1))/60)/60) - 24*(TRUNC((((86400*(date2-date1))/60)/60)/24)) hours, 
     TRUNC((((86400*(date2-date1))/60)/60)/24) days, 
     TRUNC(((((86400*(date2-date1))/60)/60)/24)/7) weeks 
    FROM TABLE 

參考:A Comparison of Oracle's DATE and TIMESTAMP Datatypes

3

你可以將日期轉換爲時間戳和使用本機的功能,以獲得單個組件出...

SELECT EXTRACT(DAY FROM (end_timestamp - start_timestamp)) days 
    , EXTRACT(HOUR FROM (end_timestamp - start_timestamp)) hours 
    , EXTRACT(MINUTE FROM (end_timestamp - start_timestamp)) minutes 
    , EXTRACT(SECOND FROM (end_timestamp - start_timestamp)) seconds 
    FROM (SELECT TO_TIMESTAMP(TO_CHAR(start_date, 'DD/MM/YYYY HH24:MI:SS') 
          , 'DD/MM/YYYY HH24:MI:SS') start_timestamp 
       , TO_TIMESTAMP(TO_CHAR(end_date, 'DD/MM/YYYY HH24:MI:SS') 
          , 'DD/MM/YYYY HH24:MI:SS') end_timestamp 
      FROM (SELECT TO_DATE('01/10/2009 14:25:01' 
           , 'DD/MM/YYYY HH24:MI:SS') start_date 
         , TO_DATE('03/10/2009 23:09:15' 
           , 'DD/MM/YYYY HH24:MI:SS') end_date 
        FROM dual 
       ) 
     ) 
3

爲什麼不只是轉換爲時間戳,並隱式使用間隔日到秒數據類型?

select to_timestamp(sysdate+1.1234) - to_timestamp(sysdate) diff 
from dual 
/

DIFF   
----------- 
1 2:57:42.0