使用extract函数生成时间间隔
在实际的报表需求中,需要统计某些指标的时间间隔,以此计算业务人员办公的实效性;例如某些流程的审批实效、复核实效等等。
Oracle提供了相应的间隔函数,NUMTODSINTERVAL,但是这中显示方式并不友好。无法直观的看出间隔。
- NUMTODSINTERVAL默认展示效果
+000000002 01:26:10.000000000
- 两个日期直接相减的展示效果
2.05983
- 通过函数套用的方式能写出相应的展示效果
2天1小时26分钟10秒
由于没有找到更好的办法,最后决定使用extract 函数获取INTERVAL中的时间单位,再进行拼接。 以下是详细的写法:
select startdate,enddate,直接相减,interv,
extract(day from interv ) ||'天' ||
extract(hour from interv )|| '小时' ||
extract(minute from interv )|| '分钟' ||
extract(second from interv ) || '秒' AS 间隔
from (
SELECT startdate,
enddate,enddate - startdate AS 直接相减,
NUMTODSINTERVAL(enddate - startdate, 'day') as interv
FROM (SELECT TO_DATE('2021-12-31 22:33:50', 'yyyy-mm-dd hh24:mi:ss') AS STARTDATE,
TO_DATE('2022-01-01 00:00:50', 'yyyy-mm-dd hh24:mi:ss') AS ENDDATE
FROM DUAL
UNION ALL
SELECT TO_DATE('2021-12-30 22:33:50', 'yyyy-mm-dd hh24:mi:ss') AS STARTDATE,
TO_DATE('2021-12-31 09:00:50', 'yyyy-mm-dd hh24:mi:ss') AS ENDDATE
FROM DUAL
UNION ALL
SELECT TO_DATE('2021-12-30 22:33:50', 'yyyy-mm-dd hh24:mi:ss') AS STARTDATE,
TO_DATE('2022-01-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AS ENDDATE
FROM DUAL
));
STARTDATE ENDDATE 直接相减 INTERV 间隔
------------------- ------------------- ---------- ------------------------------ --------------------------------------------------
2021-12-31 22:33:50 2022-01-01 00:00:50 .060416667 +000000000 01:27:00.000000000 0天1小时27分钟0秒
2021-12-30 22:33:50 2021-12-31 09:00:50 .435416667 +000000000 10:27:00.000000000 0天10小时27分钟0秒
2021-12-30 22:33:50 2022-01-02 00:00:00 2.05983796 +000000002 01:26:10.000000000 2天1小时26分钟10秒