在網上搜尋到的方法是這樣的
(注: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...