問:在Oracle,有沒有計算兩個日期之間的差的函數?
只需從另一個日期表達式中減去一個日期表達式即可得到以天數表示的差異。整數部分是整天的數量,小數部分是一天中的一小部分。簡單算術之後,乘以24得到小時。
問:如果沒有,是以小時和分鐘顯示兩個日期之間的差異的方法?
這只是將持續時間表示爲整小時和剩餘分鐘的問題。
我們可以去「老派」得到持續時間在HHHH:使用簡單的內置功能組合MI格式:
SELECT decode(sign(t.maxst),-1,'-','')||to_char(floor(abs(t.maxst)/60))||
decode(t.maxst,null,'',':')||to_char(mod(abs(t.maxst),60),'FM00')
as MaximumScheduleTime
, decode(sign(t.minst),-1,'-','')||to_char(floor(abs(t.minst)/60))||
decode(t.minst,null,'',':')||to_char(mod(abs(t.minst),60),'FM00')
as MinimumScheduleTime
, decode(sign(t.avgst),-1,'-','')||to_char(floor(abs(t.avgst)/60))
decode(t.avgst,null,'',':')||to_char(mod(abs(t.avgst),60),'FM00')
as AverageScheduleTime
FROM (
SELECT round(max((EndDate - StartDate) *1440),0) as maxst
, round(min((EndDate - StartDate) *1440),0) as minst
, round(avg((EndDate - StartDate) *1440),0) as avgst
FROM table1
) t
是的,它的fugly,但它是非常快。這裏有一個簡單的情況下,顯示出較好的是怎麼回事:
select dur as "minutes"
, abs(dur) as "unsigned_minutes"
, floor(abs(dur)/60) as "unsigned_whole_hours"
, to_char(floor(abs(dur)/60)) as "hhhh"
, mod(abs(dur),60) as "unsigned_remainder_minutes"
, to_char(mod(abs(dur),60),'FM00') as "mi"
, decode(sign(dur),-1,'-','') as "leading_sign"
, decode(dur,null,'',':') as "colon_separator"
from (select round((date_expr1 - date_expr2)*24*60,0) as dur
from ...
)
(與日期表達式替換date_expr1
和date_expr2
)
讓我們解開天 數這個
date_expr1 - date_expr2
回報差異
- 乘以1440(24 * 60)得到持續時間在幾分鐘內
round
(或floor
)來解決分數分進入整數分鐘
- 除以60,整數商是小時,其餘是分鐘
abs
函數來獲得絕對值(改變負值正)
to_char
格式模型FM00
給兩個數字(前導零)
- 使用
decode
功能來格式化一個負號和冒號(如果需要)
SQL語句可以變得不那麼難看使用PL/SQL函數,即需要計算兩個DATE參數一個持續時間(分數)天,並返回格式化HHHH:MI
(未經測試)
create function hhhhmi(an_dur in number)
return varchar2 deterministic
is
begin
if an_dur is null then
return null;
end if;
return decode(sign(an_dur),-1,'-','')
|| to_char(floor(abs(an_dur)*24))
||':'||to_char(mod((abs(an_dur)*1440),60),'FM00');
end;
隨着定義的函數:
SELECT hhhhmi(max(EndDate - StartDate)) as MaximumScheduleTime
, hhhhmi(min(EndDate - StartDate)) as MinimumScheduleTime
, hhhhmi(avg(EndDate - StartDate)) as AverageScheduleTime
FROM table1
你找到你要找的答案嗎? – 2009-07-24 12:54:53