使用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秒



posted on 2022-07-11 16:23  我是一只胖子  阅读(168)  评论(0编辑  收藏  举报