暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle DBMS_UTILITY.GET_TIME函数的真实性如何

askTom 2017-06-28
571

问题描述

我试图使用以下代码验证函数DBMS_UTILITY.GET_TIME返回的值的true。

DECLARE
  curr_time1 DATE := SYSDATE;
  curr_time2 NUMBER := dbms_utility.get_time;
BEGIN
  LOOP
   EXIT WHEN SYSDATE >= curr_time1 + (5/(24*60*60));-- exit loop after 5 seconds
  END LOOP;
  dbms_output.put_Line ('Elapsed Time = '||(dbms_utility.get_time - curr_time2)/100);
END;
/
复制


在重复执行此代码3次后,我得到了3个不同的值,如下所示。


PL/SQL过程成功完成。

经过时间 = 4.17

PL/SQL过程成功完成。

经过时间 = 4.36

PL/SQL过程成功完成。

经过时间 = 4.02


显然,在完成5秒的循环后,我预计经过的时间会接近5秒,或者至少大于5秒,但我很惊讶地看到这些值不是这样。我错过了什么吗?

专家解答

你在这里观察到的是由于日期的粒度。这些只报告时间到最接近的秒。

因此,如果您在00:00:00.999999处获得初始时间,则您的变量具有00:00:00的 (时间) 值。当时间到00:00:05时,您的循环将退出。因此,它只是4.00000...1s之前,你打这个!

切换到具有高达9小数秒精度的时间戳,您应该会看到它一致地报告5s:

declare
  curr_time1   timestamp with time zone := systimestamp;
  curr_time2   number := dbms_utility.get_time;
begin

  loop
    exit when current_timestamp >= curr_time1 + interval '5' second;
  end loop;

  dbms_output.put_line( 'Elapsed Time = '
   || ( dbms_utility.get_time - curr_time2 ) / 100 );

end;
/
Elapsed Time = 5
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论