一、场景复现
原使用oracle的项目组,今天反馈生产应用报了个错:
ERROR:interval_mul result month:0.000000,day: 2147493432.760000 overflow
Oracle中,经常使用类似的用法,对时间做计算:
二、原理分析
关于日期的加减计算,在oracle中得到的结果是number,代表的是两个日期之间的天数差值:
但是在openGauss中,默认返回的数据类型是interval:
关于interval 类型,是用于表示时间的间隔或时间段,可以存储年、月、日、小时、分钟、秒等单位的时间量:
比如可以操作常见的日期计算:
日期的提取:
关于代码中,interval*float8
或者interval*int
这类操作有限制:
Interval的月和天字段是int32类型,ans_day 或 ans_month 就不能超过 ±2^31-1 (±2147483647).
例子中interval*int,返回值也还是interval,就会受到这个大小的约束。
三、推荐解决方案
将日期转换为整数,再做计算