首页 > 解决方案 > ORA-01873: 使用 EXTRACT 函数时区间的前导精度太小

问题描述

EXTRACT在尝试获得 8-12 小时的秒间隔时,我遇到了奇怪的功能问题。

这是使用 Oracle 12.2 测试的示例: https ://rextester.com/ZMR79428

declare 
  start_time_ TIMESTAMP;  
  exect_time_ NUMBER;  
begin
start_time_ := SYSDATE- 1/3;  -- 8 hours, error is for SYSDATE- 1/2
exect_time_ := extract(day from ((sysdate- start_time_)*86400));
dbms_output.put_line(exect_time_);
end;

我看不出我做错了什么来获得间隔的前导精度是这段代码中的错误太小。它适用于所有其他场景。例如:SYSDATE -1/4工作正常。

标签: oracleplsqlprecisionoracle12c

解决方案


我认为这个问题是因为间隔中数字太大的限制。

实际上,问题在于乘法。

如果您在没有或使用小的乘数的情况下执行它,您将得到答案。

SQL> select extract(day from ((systimestamp - (systimestamp - 1/3)))) from dual ;

EXTRACT(DAYFROM((SYSTIMESTAMP-(SYSTIMESTAMP-1/3))))
---------------------------------------------------
                                                  0

SQL> select extract(day from ((systimestamp - (systimestamp - 1/3))*8640)) from dual ;

EXTRACT(DAYFROM((SYSTIMESTAMP-(SYSTIMESTAMP-1/3))*8640))
--------------------------------------------------------
                                                    2880

SQL> select extract(day from ((systimestamp - (systimestamp - 1/3))*86400)) from dual ;
select extract(day from ((systimestamp - (systimestamp - 1/3))*86400)) from dual
                                                              *
ERROR at line 1:
ORA-01873: the leading precision of the interval is too small


SQL>

无论您对这个数字做什么,都需要考虑不同的逻辑,因为不建议在时间戳列上进行乘法运算。

干杯!!


推荐阅读