Oracle獲取時間間隔以及轉換為時分秒格式
1、獲取2個輸入時間的時間間隔
兩個Date型別欄位:START_DATE,END_DATE,計算這兩個日期的時間差(分別以天,小時,分鐘,秒,毫秒): 天: ROUND(TO_NUMBER(END_DATE - START_DATE)) 小時: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24) 分鐘: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60) 秒: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60) 毫秒: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 1000)
示例:
select round(to_number(TO_DATE('2012-02-20 17:45:04','yyyy-mm-dd hh24:mi:ss')-TO_DATE('2012-02-19 08:34:04','yyyy-mm-dd hh24:mi:ss')),2) as Day from dual;--天 select round(to_number(TO_DATE('2012-02-20 17:45:04','yyyy-mm-dd hh24:mi:ss')-TO_DATE('2012-02-19 08:34:04','yyyy-mm-dd hh24:mi:ss'))*24,2) as Hour from dual;--小時
2、利用Extract函式將時間間隔轉換成{天時分秒}格式
//oracle中extract()函式從oracle 9i中引入,用於從一個date或者interval型別中擷取到特定的部分
//語法如下:
EXTRACT (
{ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
| { TIMEZONE_HOUR | TIMEZONE_MINUTE }
| { TIMEZONE_REGION | TIMEZONE_ABBR }
FROM { date_value | interval_value } )
//我們只可以從一個date型別中擷取 year,month,day(date日期的格式為yyyy-mm-dd);
獲取日期中的擷取值:
select extract(day from date'2011-05-17') day from dual;
時間間隔通過to_timestamp()相減後的值包含時分秒,例如 dt2-dt1=+000000102 04:01:46.000000000,因此,to_timestamp()轉換的時間可以擷取使用
select extract(day from dt2-dt1) day
,extract(hour from dt2-dt1) hour
,extract(minute from dt2-dt1) minute
,extract(second from dt2-dt1) second
from (
select to_timestamp('2011-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1
,to_timestamp('2011-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2
from dual)
時間間隔通過to_date()相減後的值不包含時分秒,是包含小數的天值,例如 dt2-dt1=102.167893518519天,to_date()轉換的時間需要將Day轉換為Second才能被extract識別,如下:
SELECT
(EXTRACT(DAY FROM (to_date('2012-03-30 00:00:00','YYYY-MM-DD HH24:MI:ss')-to_timestamp('2012-03-29 00:00:00','YYYY-MM-DD HH24:MI:ss')) DAY TO SECOND )
|| '天'
||EXTRACT(HOUR FROM (to_date('2012-03-30 00:00:00','YYYY-MM-DD HH24:MI:ss')-to_date('2012-03-29 00:00:00','YYYY-MM-DD HH24:MI:ss')) DAY TO SECOND )
|| '時'
|| EXTRACT(MINUTE FROM (to_date('2012-03-30 23:23:15','YYYY-MM-DD HH24:MI:ss')-to_date('2012-03-29 00:23:00','YYYY-MM-DD HH24:MI:ss')) DAY TO SECOND )
|| '分'
|| EXTRACT(SECOND FROM (to_date('2012-03-30 23:23:15','YYYY-MM-DD HH24:MI:ss')-to_date('2012-03-29 00:23:00','YYYY-MM-DD HH24:MI:ss')) DAY TO SECOND )
|| '秒') as timespan_
FROM DUAL;
3、利用numtodsinterval()方法,該方法只轉換成時分秒,如果溢位,則重新開始。
示例:將123.13小時轉換成時分秒格式,結果:03:07:48
select SUBSTR(numtodsinterval(123.13,'hour'),12,8) from dual;
4、如果確定時間間隔在一天之內,可以使用如下方式,將不到一天的時間間隔*86400轉換成秒,再將秒數利用to_date('','SSSSS')換算成當天的時間,換算完成後的具體時間即是要求的時間間隔的時分秒格式資料。
select to_date(0,'SSSSS') from dual;--2018/6/1,當天0時0分0秒
select to_date(1,'SSSSS') from dual;--2018/6/1 0:00:01,當天0時0分1秒
select to_date(86399,'SSSSS') from dual;--2018/6/1 23:59:59,當天23時59分59秒
select
to_char(to_date(trunc((to_date('2012-11-1 23:59:59','yyyy-mm-dd hh24:mi:ss')-to_date('2012-11-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) *86400),'SSSSS'),'fmhh24"小時"mi"分鐘"ss"秒"' )
from dual