2013-04-02 125 views
1

我想在Oracle中想出一種方法來計算日期之間的差異。Oracle - 查詢兩個日期之間的差異

總之。我有兩個數據字段「starts_at」和「ends_at」,這些字段的DATA_TYPE是「TIMESTAMP(6)」

例如。我有以下情形:

「begins_at」 值爲「26-MAR-13 02.50.00.000000000 PM」

「ends_at」 值爲「30-MAR-13 09.25.00.000000000 PM」

我試圖計算兩天時間戳之間的差異。在Oracle中可能嗎?

我嘗試了以下聲明,但扔了一個錯誤:

Select TO_DATE(begins_at, 'YYYYMMDD HH:MI:SS AM') - TO_DATE(ends_at, 'YYYYMMDD HH:MI:SS AM') day_diff 

From dual 

任何提示是非常讚賞。

+2

「*,但扔了一個錯誤*」:和錯誤是什麼? –

回答

7

正如我們的匿名馬朋友指出的,'拋出一個錯誤'沒有幫助。但是,很可能你會得到一個ORA-01830,「在轉換整個輸入字符串之前結束日期格式的圖片」,或者ORA-1858,「發現一個非數字字符,數字在預期的位置」或類似的東西。

to_date function需要一個char的參數,所以當你將你的timestamp字段傳遞給它時會發生隱式轉換;你基本上是這樣做的:

to_date(to_char(begins_at, 'DD-MON-RR'), 'YYYYMMDD HH:MI:SS AM') 

...只使用您的默認NLS設置;我猜你已經將NLS_DATE_FORMAT設置爲'DD-MON-RR'了。確切的值會影響你得到的錯誤。 timestamp作爲字符串提供的格式與您爲to_date指定的格式不匹配。

您不應該依賴隱式轉換,但您根本不需要進行轉換。可以直接比較timestamp的值,結果解釋爲in the documentation。只是減去一個值形成另一個會給你答案爲interval數據類型:

select ends_at - begins_at from t42; 

ENDS_AT-BEGINS_AT 
--------------------------------------------------------------------------- 
+000000004 06:35:00.000000 

如果你只是想整天部分可以使用extract

選擇提取(天從ends_at - begins_at )從t42開始;

EXTRACT(DAYFROMENDS_AT-BEGINS_AT) 
--------------------------------- 
           4 

您也可以治療timestampdate使用cast

select cast(ends_at as date) - cast(begins_at as date) from t42; 

CAST(ENDS_ATASDATE)-CAST(BEGINS_ATASDATE) 
----------------------------------------- 
           4.27430556 

我不知道爲什麼你使用timestamp都不過。 Oracle date type includes a time portion,精度達到秒。由於您目前沒有使用時間戳的小數部分,因此堅持使用date可能會使操作變得更簡單,但我想這取決於您打算如何處理這些字段。

+0

你對錯誤評估是正確的。我的發言是拋出一個「ORA-01858:發現一個非數字字符的地方,數字是預期的」,「01858. 00000 - 」一個非數字字符被發現的地方,數字是預期的「。我的第一個問題 但是,EXTRACT函數返回了我正在查找的值。謝謝您的輸入! –

+0

如果我想減去兩個日期 - d1 = 2月26日8:30和2 = 28日2月8:15 d2-d1 = 1的結果,但是我希望它是2(差異的天數) 我想,應該減去日期中的天數,但它顯示爲1. 原因是d1和d2是1天23小時45分鐘,所以在四捨五入之後它將輸出1天。 我想要輸出2(只有幾天的時間)我該怎麼做? – doga

+1

@doga - 與這個問題無關,你應該問一個新問題。但是這個減法給出了1.9895833而不是1。你可以使用'ceil()'強制它達到2;或'round()'。或比較截斷的日期。取決於你希望不同的日期對錶現如何。 –

1

嘗試這樣:

SELECT TO_DATE('20120125 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM') 
    - TO_DATE('20120120 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') day_diff 
FROM dual 

你可以參考this。它會真的幫助你

1

天,小時,分鐘,秒差異。例如 - 複製/粘貼以查看輸出。與您的日期更換日期...:只有

SELECT start_date, end_date, time_diff, 
     EXTRACT(DAY FROM time_diff) days, 
     EXTRACT(HOUR FROM time_diff) hours, 
     EXTRACT(MINUTE FROM time_diff) minutes, 
     EXTRACT(SECOND FROM time_diff) seconds 
    FROM 
    (
    Select start_date, end_date, (end_date - start_date) time_diff 
    From 
    (
     Select CAST(to_date('01/01/2012 10:00:00 am', 'dd/mm/yyyy hh:mi:ss am') AS TIMESTAMP) end_date 
      , CAST(to_date('01/01/2012 07:00:00 am', 'dd/mm/yyyy hh:mi:ss am') AS TIMESTAMP) start_date 
     From dual 
    ) 
    ) 
/

減去時間例如:

SELECT trunc(mydate/3600) hr 
    , trunc(mod(mydate, 3600)/60) mnt 
    , trunc(mod(mydate, 3600)/60 /60) sec 
    FROM 
    (
    SELECT (to_date('01/03/2012 10:00:00', 'mm/dd/yyyy hh24:mi:ss') - 
      to_date('01/01/2012 07:00:00', 'mm/dd/yyyy hh24:mi:ss')) * 86400 mydate 
    FROM dual 
) 
/

HR MNT SEC 
------------- 
51 0 0