oracle日期函式(4)

jss001發表於2009-02-16
在Oracle中實現時間相加處理
-- 名稱:Add_Times
-- 功能:返回d1與NewTime相加以後的結果,實現時間的相加
-- 說明:對於NewTime中的日期不予考慮
-- 日期:2004-12-07
-- 版本:1.0
-- 作者:Kevin


create or replace function Add_Times(d1 in date,NewTime in date) return date
is
hh number;
mm number;
ss number;
hours number;
dResult date;
begin
-- 下面依次取出時、分、秒
select to_number(to_char(NewTime,'HH24')) into hh from dual;
select to_number(to_char(NewTime,'MI')) into mm from dual;
select to_number(to_char(NewTime,'SS')) into ss from dual;
-- 換算出NewTime中小時總和,在一天的百分幾
hours := (hh + (mm / 60) + (ss / 3600))/ 24;
-- 得出時間相加後的結果
select d1 + hours into dResult from dual;
return(dResult);
end Add_Times;


-- 測試用例
-- select Add_Times(sysdate,to_date('2004-12-06 03:23:00','YYYY-MM-DD HH24:MI:SS')) from dual


在Oracle9i中計算時間差
計算時間差是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)- 消逝的時間(以分鐘為單位)

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

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

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)系統級觸發機制來計算已經開始的會話時間並把它放入一個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;
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017437/,如需轉載,請註明出處,否則將追究法律責任。

相關文章