我有一个关于sql函数的问题:floor()
为什么使用floor执行SQL会导致299,它应该是300?您遇到了一些奇怪的精度问题 但解决方法很简单-删除多余的我有一个关于sql函数的问题:floor(),sql,oracle,floor,Sql,Oracle,Floor,为什么使用floor执行SQL会导致299,它应该是300?您遇到了一些奇怪的精度问题 但解决方法很简单-删除多余的到_NUMBER(两个日期的差值是一个数字),然后得到正确的结果 select floor(to_number(to_date('20180620130000','yyyy-mm-dd hh24:mi:ss')-to_date('20180620080000', 'yyyy-mm-dd hh24:mi:ss'))*24*60) from dual; select to_nu
到_NUMBER
(两个日期的差值是一个数字),然后得到正确的结果
select floor(to_number(to_date('20180620130000','yyyy-mm-dd hh24:mi:ss')-to_date('20180620080000', 'yyyy-mm-dd hh24:mi:ss'))*24*60)
from dual;
select to_number(to_date('20180620130000','yyyy-mm-dd hh24:mi:ss')-to_date('20180620080000', 'yyyy-mm-dd hh24:mi:ss'))*24*60
from dual;
您遇到了一些奇怪的精度问题 但解决方法很简单-删除多余的
到_NUMBER
(两个日期的差值是一个数字),然后得到正确的结果
select floor(to_number(to_date('20180620130000','yyyy-mm-dd hh24:mi:ss')-to_date('20180620080000', 'yyyy-mm-dd hh24:mi:ss'))*24*60)
from dual;
select to_number(to_date('20180620130000','yyyy-mm-dd hh24:mi:ss')-to_date('20180620080000', 'yyyy-mm-dd hh24:mi:ss'))*24*60
from dual;
不相关,但是:
to_number()
是无用的(实际上这是一个等待发生的错误),因为从另一个日期减去一个日期将返回一个数字。无需将该数字转换为varchar,然后再转换回一个数字(这就是to_number()
将要做的)@a_horse\u与\u no_nameto_number
相关删除它,然后得到正确的结果。是的,你是正确的,但是:to_number()
是无用的(实际上这是一个等待发生的bug)因为从一个日期减去另一个日期已经返回一个数字。无需将该数字转换为varchar,然后再转换回一个数字(这就是to_number()
将要做的)@a_horse\u与\u no\u nameto_number
相关删除它,您将得到正确的结果。是的,您是right@yang是的,很有趣,确切的原因我不清楚;)日期减法的结果不是正常的(2型)数字;转储它显示了一个内部(据我所见,未记录)数据类型14,Oracle会根据需要将其转换为其他类型。它似乎保留了精确的秒数,而不是那一点的小数。通过隐式转换为字符串并返回正常数字,数据类型会发生变化,结果无法准确表示。我发现,这节省了我一些实验*8-)是的,date-date的结果是0.208333333。从dual中选择(0.208333333*24*60)作为数量,选择floor(0.208333333*24*60)作为flr;结果是300和299。@yang-(a)数据日期的结果以数字形式呈现给您(或您的客户)-请参阅我之前的评论;(b)您的to_num
值不是300,而是299.999999995,但您的客户正在将其舍入以供显示。如果您使用的是SQL*Plus或SQL Developer,请执行设置numwidth 17
并重试。我知道了,to_char也反映了您所说的,谢谢you@yang是的,很有趣,确切的原因我不清楚;)日期减法的结果不是正常的(2型)数字;转储它显示了一个内部(据我所见,未记录)数据类型14,Oracle会根据需要将其转换为其他类型。它似乎保留了精确的秒数,而不是那一点的小数。通过隐式转换为字符串并返回正常数字,数据类型会发生变化,结果无法准确表示。我发现,这节省了我一些实验*8-)是的,date-date的结果是0.208333333。从dual中选择(0.208333333*24*60)作为数量,选择floor(0.208333333*24*60)作为flr;结果是300和299。@yang-(a)数据日期的结果以数字形式呈现给您(或您的客户)-请参阅我之前的评论;(b)您的to_num
值不是300,而是299.999999995,但您的客户正在将其舍入以供显示。如果您使用的是SQL*Plus或SQL Developer,请执行设置numwidth 17
并重试。我知道了,to_char也反映了您所说的,谢谢