2009-06-04 45 views
1

在Oracle中,是否有計算兩個日期之間差異的函數?如果沒有,是以小時和分鐘顯示兩個日期之間的差異的一種方法?在Oracle中,是否有一個函數可以計算兩個日期之間的差異?

查詢:

SELECT Round(max((EndDate - StartDate) * 24), 2) as MaximumScheduleTime, 
     Round(min((EndDate - StartDate) * 24), 2) as MinimumScheduleTime, 
     Round(avg((EndDate - StartDate) * 24), 2) as AveragegScheduleTime 
FROM table1 
+0

你找到你要找的答案嗎? – 2009-07-24 12:54:53

回答

4

使用Oracle的日期,這是相當 瑣碎,你可以簡單地通過減去 他們或得到任何TOTAL (日,時,分,秒),日期 2之間用一下你可以 得到天/小時/分/秒 之間。

http://asktom.oracle.com/tkyte/Misc/DateDiff.html

而且,從上面的鏈接:

如果你真的想在你的 數據庫 'DATEDIFF',你可以做一些 這樣的:

SQL> create or replace function datediff(p_what in varchar2, 
    2          p_d1 in date, 
    3          p_d2 in date) return number 
    4 as 
    5  l_result number; 
    6 begin 
    7  select (p_d2-p_d1) * 
    8    decode(upper(p_what), 
    9      'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL) 
10  into l_result from dual; 
11 
11  return l_result; 
12 end; 
13/
Function created 
+0

請提供用法,p_what用於什麼 – Donny 2013-10-21 13:43:22

8

您可以使用這些功能:

1)提取物(元件FROM temporal_value)

2)NUMTOYMINTERVAL(N,單元)

3)NUMTODSINTERVAL(N,單元)。

例如:

SELECT EXTRACT(DAY FROM NUMTODSINTERVAL(end_time - start_time, 'DAY')) 
    || ' days ' || 
    EXTRACT(HOUR FROM NUMTODSINTERVAL(end_time - start_time, 'DAY')) 
    ||':'|| 
    EXTRACT(MINUTE FROM NUMTODSINTERVAL(end_time - start_time, 'DAY')) 
    ||':'|| 
    EXTRACT(SECOND FROM NUMTODSINTERVAL(end_time - start_time, 'DAY')) 
    "Lead Time" 
FROM table; 
+0

注意:此解決方案在大於24小時的持續時間內不報告小時數。也就是說,如果end_time和start_time之間的差值大於24小時,則這將返回經過的小時數減去整個24小時的時間段。 – spencer7593 2009-06-05 18:16:54

10

您可以在Oracle中減去兩個日期。結果是表示兩個日期之間的天數的FLOAT。您可以對小數部分進行簡單的算術運算,以計算小時數,分鐘數和秒數。

下面是一個例子:

SELECT TO_DATE('2000/01/02:12:00:00PM', 'yyyy/mm/dd:hh:mi:ssam')-TO_DATE('2000/01/01:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam') DAYS FROM DUAL 

結果:1.5

3

問:在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_expr1date_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 
0

可以使用MONTHS_BETWEEN函數日期轉換爲區別在年再小數年之間使用你有興趣:

CASE 
WHEN ((MONTHS_BETWEEN(TO_DATE(date1, 'YYYYMMDD'), 
         TO_DATE(date1,'YYYYMMDD'))/12 
     ) 
     BETWEEN Age1DecimalInYears AND Age2DecimalInYears 
    ) 
THEN 'It is between the two dates' 
ELSE 'It is not between the two dates' 
END; 

您可能需要更改日期格式以匹配給定的日期格式,並確認有31天的月工作,爲您的具體方案。

參考文獻: (WWW上發現2015年5月15日)
1. Oracle/PLSQL: MONTHS_BETWEEN Function
2. Oracle Help Center - MONTHS_BETWEEN

相關問題