計算時間差是oracledata數據類型的一個常見問題。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>selectsysdate-(sysdate-3)fromdual;
sysdate-(sysdate-3)
-------------------
3
這里,我們看到了oracle使用天來作為消逝時間的單位,所以我們可以很容易的使用轉換函數來把它轉換成小時或者分鐘。然而,當分鐘數不是一個整數時,我們就會遇到放置小數點的問題。
select
(sysdate-(sysdate-3.111))*1440
from
dual;
(sysdate-(sysdate-3.111))*1440
------------------------------
4479.83333
當然,我們可以用round函數(即取整函數)來解決這個問題,但是要記住我們必須首先把date數據類型轉換成number數據類型。
select
round(to_number(sysdate-(sysdate-3.111))*1440)
from
dual;
round(to_number(sysdate-(sysdate-3.111))*1440)
----------------------------------------------
4480
我們可以用這些函數把一個消逝時間近似轉換成分鐘并把這個值寫入oracle表格中。在這個例子里,我們有一個離線(logoff)系統級觸發機制來計算已經開始的會話時間并把它放入一個oraclestatspackuser_log擴展表格之中。
update
perfstat.stats$user_log
set
elapsed_minutes=
round(to_number(logoff_time-logon_time)*1440)
where
user=user_id
and
elapsed_minutesisnull;