天天看點

在oracle中計算時間差

計算時間差是oracle data資料類型的一個常見問題。oracle支援日期計算你可以建立諸如“日期1日期2”這樣的表達式來計算這兩個日期之間的時間差。

一旦你發現了時間差異你可以使用簡單的技巧來以天、小時、分鐘或者秒為機關來計算時間差。為了得到資料差你必須選擇合适的時間度量機關這樣就可以進行資料格式隐藏。

使用完善複雜的轉換函數來轉換日期是一個誘惑但是你會發現這不是最好的解決方法。

round(to_number(end-date-start_date))- 消逝的時間以天為機關

round(to_number(end-date-start_date)*24)- 消逝的時間以小時為機關

round(to_number(end-date-start_date)*1440)- 消逝的時間以分鐘為機關k7zr{{-:w[本資料來源于貴州學習網 http://www.gzu521.com]k7zr{{-:w

顯示時間差的預設模式是什麼為了找到這個問題的答案讓我們進行一個簡單的sql *plus查詢。

sql> select sysdate-(sysdate-3) from dual;

sysdate-(sysdate-3)

-------------------

3

這裡我們看到了oracle使用天來作為消逝時間的機關是以我們可以很容易的使用轉換函數來把它轉換成小時或者分鐘。然而當分鐘數不是一個整數時我們就會遇到放置小數點的問題。

select

(sysdate-(sysdate-3.111))*1440

from

dual;

------------------------------

4479.83333

當然我們可以用round函數即取整函數來解決這個問題但是要記住我們必須首先把date資料類型轉換成number資料類型。

round(to_number(sysdate-(sysdate-3.111))*1440)

----------------------------------------------

4480

我們可以用這些函數把一個消逝時間近似轉換成分鐘并把這個值寫入oracle表格中。在這個例子裡我們有一個離線logoff系統級觸發機制來計算已經開始的會話時間并把它放入一個oracle statspack user_log擴充表格之中。

update

perfstat.stats$user_log

set

elapsed_minutes =

round(to_number(logoff_time-logon_time)*1440)

where

user = user_id

and

elapsed_minutes is null;