Oracle 时间相减时精度丢失问题
首先此问题发生于一个很巧然的需求(后面简单介绍);说巧然是因为发生的概率实在是非常小,但其在11g版本中也依然存在。
见下面SQL语句:
select (d1 - d2) * 24 * 60 * 60 as diff1, (d2 - d3) * 24 * 60 * 60 as diff2, floor(60 / 15) f, floor((d1 - d2) * 24 * 60 * 60 / 15) f2, floor((d2 - d3) * 24 * 60 * 60 / 15) f3 from (select to_date('2013-6-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss') as d1, to_date('2013-6-21 23:59:00', 'yyyy-mm-dd hh24:mi:ss') as d2, to_date('2013-6-21 23:58:00', 'yyyy-mm-dd hh24:mi:ss') as d3 from dual)
执行结果:
DIFF1 DIFF2 F F2 F3
60 60 4 3 4
SQL语句目的是对两两时间相减得出的秒数后除15取整。(floor为Oracle里自带的取整函数),从sql里我们很简单的得出 (d1与d2) 和 (d2与d3) 相差秒数都为60,但f2结果却为3,明显不对。f3却又是正确的。
可以猜测的是d1(跨天时间)在与d2相减后转化为秒时发生了精度丢失;因此d1-d2 不对,d2-d3没有问题。
在得知此问题后,解决方法是在取整前先对结果进行四舍五入
即:
floor(round((d1 - d2) * 24 * 60 * 60) / 15) f2
到此我们知道发生此问题的概率实在是很小吧,首先若只是单纯的针对时间相减并转化为单位秒还不会有问题,但如果需要进一步对值进行运算并取整就要小心了,若减数刚好跨天就可能会存在错误! 在此提出来希望为大家借鉴。
相关推荐
oracle 日期相减
西门子博途1200 时间相减
。。。
C#中两时间相减(return x天x小时x分x秒)
输入一个起始时间和一个结束时间(起始时间早于结束时间),通过运算符重载-(减号),计算这两个时间相隔多少秒钟。说明:这两个时间在同一小时之内,且采用60分钟60秒钟的计时分式,即从00:00-59:59。
里面有字符是否符时间期的两个函数,一个纯日期,还有一个加了时分秒。经测试可以用的
广告位展示 数字日历 自定义对话框 日期相减 gallery广告位 相册上传
主要介绍了C#实现两个时间相减的方法,实例分析了C#针对时间操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
javaScript和java中日期相减得出天数方案
利用 oracle sql 实现 计算一段时间内(除去周六日)的秒数
主要介绍了javascript解决小数的加减乘除精度丢失的方案的相关资料以及JavaScript中关于丢失数字精度的问题的探讨,非常的详细,需要的朋友可以参考下
WinForm中界面日期相减(DateTimePicker控件)
日期时间相减、累计小时的计算公式
两个日期相减获得之间的天数
c# 倒计时--时间相减 。。。。。。。。。。。。。。。。。。。
在应用中,有时需要将点云数据去掉背景,保留本体,最简单的方法,将点云数据与背景数据相减,留下来的既是本体数据
实现两个数值型的日期相减得出天数的函数。
WPF 时间加减小例子、获取当前时间进行年月日时分秒的加减
界面日期相减DateTimePicker,界面日期相减DateTimePicker