oracle - 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
工作正常。
解决方案
我认为这个问题是因为间隔中数字太大的限制。
实际上,问题在于乘法。
如果您在没有或使用小的乘数的情况下执行它,您将得到答案。
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>
无论您对这个数字做什么,都需要考虑不同的逻辑,因为不建议在时间戳列上进行乘法运算。
干杯!!
推荐阅读
- java - maven surefire 插件没有并行执行运行器
- c++ - isalpha() 函数允许通过拉丁字母,尽管语言环境设置为俄语
- hive - 在 Hive 中,如何组合多个表以生成包含对象数组的单行?
- php - clouser函数没有在类文件中调用
- azure-active-directory - 使用图形 api 查询第三方 azure AD 的 AD 应用程序注册或企业应用程序?
- php - PHP 从表 1 中选择并插入表 2,表 2 上的 id 返回为 0
- java - 如何设置mysql的时区?
- reactjs - “TypeError:无法使用 chrome-devtools 读取未定义的属性 'pseudoType'”
- reactjs - 如何在反应中解决 1 not === 1
- python - 动画子类