0

请在下面的代码中帮助我从 DBMS_UTILITY.get_cpu_time 计算时间 HH:MI:SS:MS。

Declare
v_start_time number;
v_end_time number;
v_exec_time varchar2(100);
begin
v_start_time:=DBMS_UTILITY.get_cpu_time;

dbms_output.put_line('Time calculation');

v_end_time:=DBMS_UTILITY.get_cpu_time;

v_exec_time:= (v_end_time-v_start_time); --please help me here i want v_exec_time in the format of HH:MI:SS:MS)

end;
/

提前致谢。

4

1 回答 1

2

DBMS_UTILITY.get_cpu_time以 1/100 秒 (hsecs) 为单位返回时间。

首先我们可以得到完整的秒数,如下所示:

v_secs := floor(v_exec_time/100);

以 hsecs 为单位的余数是

v_exec_time - (v_secs*100);

你想要毫秒,所以:

v_remainder_ms := (v_exec_time - (v_secs*100)) * 10;

现在对于 HH:MI:SS 部分,我们可以使用 Oracle 日期函数。首先将 v_secs 的值转换为天数:

v_days := v_secs/60/60/24;

现在使用它来获取 HH:MI:SS 值:

TO_CHAR(TRUNC(SYSDATE)+v_days,'HH24:MI:SS')

(注意:需要使用 HH24 否则会得到类似 '12:00:00:001' 的值!)

您想要的完整 HH24:MI:SS:MS 值是:

TO_CHAR(TRUNC(SYSDATE)+v_days,'HH24:MI:SS')||':'||TO_CHAR(v_remainder_ms,'FM000')

所以把它们放在一起:

Declare
   v_start_time number;
   v_end_time number;
   v_exec_time varchar2(100);
   v_secs integer;
   v_remainder_ms integer;
   v_days number;
begin
   v_start_time:=DBMS_UTILITY.get_time;

   dbms_output.put_line('Time calculation');

   v_end_time:=DBMS_UTILITY.get_time;

   v_exec_time:= (v_end_time-v_start_time);

   v_secs := floor(v_exec_time/100);

   v_remainder_ms := (v_exec_time - (v_secs*100)) * 10;

   v_days := v_secs/60/60/24;

   dbms_output.put_line ('Result='||TO_CHAR(TRUNC(SYSDATE)+v_days,'HH24:MI:SS')
        ||':'||TO_CHAR(v_remainder_ms,'FM000'));

end;
于 2013-06-05T10:04:25.570 回答