Oracle计算两个日期天数差出现意外值,求解决方法
解决PL/SQL日期差计算返回小数的问题
你遇到的问题根源是Oracle的DATE类型包含年月日+时分秒完整时间信息,直接相减时,小数部分是时分秒换算成天的比例(比如0.4165625约等于10小时)。要得到整数天数,有几种简单可行的解决方式:
方法1:用TRUNC()截断时分秒
TRUNC()函数会把日期的时分秒部分清零,只保留年月日维度,相减后得到的就是纯粹的天数差:
DECLARE roll_counter number:=1; initial_date date; final_date date; date_calc number; BEGIN loop select date_of_issue into initial_date from borrower where roll_no=roll_counter; select current_date into final_date from fine where roll_no=roll_counter; -- 截断日期后计算差值 date_calc:=TRUNC(final_date) - TRUNC(initial_date); dbms_output.put_line(date_calc); roll_counter:=roll_counter+1; exit when roll_counter>4; end loop; END; /
方法2:用ROUND()四舍五入到整数
如果业务允许按时间点四舍五入(比如当天超过12点算完整一天),可以直接对相减结果取整:
date_calc:=ROUND(final_date - initial_date);
方法3:用EXTRACT()提取天数
通过NUMTODSINTERVAL把差值转换为标准时间间隔,再提取天数部分:
date_calc:=EXTRACT(DAY FROM NUMTODSINTERVAL(final_date - initial_date, 'DAY'));
更高效的写法:去掉循环,直接关联查询
其实不需要用PL/SQL循环,直接用SQL关联两张表就能一次性得到所有结果,执行效率更高:
SELECT b.roll_no, TRUNC(f.current_date) - TRUNC(b.date_of_issue) AS day_diff FROM borrower b JOIN fine f ON b.roll_no = f.roll_no;
执行以上任意一种方法,你都会得到预期的整数结果:比如02-JAN-2022到14-FEB-2022的差值会是43天。
内容的提问来源于stack exchange,提问作者tdcoder
相关产品推荐
相关产品推荐

