orcl中查詢兩個時間的差值(包括時分秒)

2021-08-10 22:23:07 字數 3397 閱讀 9992

在網上搜尋到的方法是這樣的

(注:oracle時間差是以天數為單位,所以換算成年月,日)

select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanyears from dual        //時間差-年

select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanmonths from dual        //時間差-月

select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spandays from dual             //時間差-天

select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanhours from dual         //時間差-時

select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanminutes from dual    //時間差-分

select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanseconds from dual //時間差-秒

只有年月日是實際差值,無法計算到時分秒實際差值,時分秒是按照天數計算的,不是實際的差值。

以下是我使用巢狀case when 的方式獲取的實際差值

select

(eom_failure_b.failure_time) failure_time,/*開始時間*/

(eom_failure_b.restore_time) restore_time,/*結束時間*/

case

when eom_failure_b.restore_time is null  /*結束時間為空,不計算時差*/

then null

else    /*結束時間不為空,計算時差*/

floor(to_number(to_date(eom_failure_b.restore_time,'yyyy-mm-dd hh24:mi:ss')-to_date(eom_failure_b.failure_time,'yyyy-mm-dd hh24:mi:ss')))  /*天數的計算,使用網上查詢的方式*/

|| '天' ||

(case

when to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2)) >= 0

and  to_number(substr(eom_failure_b.restore_time,15,2)-substr(eom_failure_b.failure_time,15,2)) >= 0

then to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2))                /*結束時間小時數-開始時間小時數》 0且結束時間分鐘數-開始時間分鐘數》 0 ,直接做減法*/

when to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2)) >= 0

and  to_number(substr(eom_failure_b.restore_time,15,2)-substr(eom_failure_b.failure_time,15,2)) < 0

then to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2)) – 1          /*結束時間小時數-開始時間小時數》 0,結束時間分鐘數-開始時間分鐘數< 0 ,分鐘位需要借位,小時數做減法後再-1*/

when to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2)) < 0

and  to_number(substr(eom_failure_b.restore_time,15,2)-substr(eom_failure_b.failure_time,15,2)) >= 0

then to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2)) + 24       /*結束時間小時數-開始時間小時數<0,結束時間分鐘數-開始時間分鐘數》 0 ,小時數做減法後再+24*/

else to_number(substr(eom_failure_b.restore_time,12,2)-substr(eom_failure_b.failure_time,12,2)) + 23        /*結束時間小時數-開始時間小時數<0,結束時間分鐘數-開始時間分鐘數,< 0 ,分鐘位需要借位,小時數做減法後再+24-1*/

end)  || '時' ||

(case

when to_number(substr(eom_failure_b.restore_time,15,2)-substr(eom_failure_b.failure_time,15,2)) >= 0  

then to_number(substr(eom_failure_b.restore_time,15,2)-substr(eom_failure_b.failure_time,15,2))                /*結束時間分鐘數-開始時間分鐘數》 0 ,直接做減法*/

else to_number(substr(eom_failure_b.restore_time,15,2)-substr(eom_failure_b.failure_time,15,2)) + 60        /*結束時間分鐘數-開始時間分鐘數< 0 ,減法後+60分鐘*/

end)  ||'分'

end     

from eom_failure_b eom_failure_b

下面是查詢結果圖

Oracle 計算兩個時間的差值

oracle 計算兩個時間的差值 有兩個日期資料start date,end date,欲得到這兩個日期的時間差 以天,小時,分鐘,秒,毫秒 天 round to number end date start date 小時 round to number end date start date 24...

Oracle 計算兩個時間的差值

有兩個日期資料start date,end date,欲得到這兩個日期的時間差 以天,小時,分鐘,秒,毫秒 天 round to number end date start date 小時 round to number end date start date 24 分鐘 round to numb...

15 oracle 計算兩個時間的差值

第一部分 有兩個日期資料start date,end date,欲得到這兩個日期的時間差 以天,小時,分鐘,秒,毫秒 天 round to number end date start date 小時 round to number end date start date 24 分鐘 round to...