Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中舍入为最接近的奇数整数_Sql_Rounding - Fatal编程技术网

在SQL中舍入为最接近的奇数整数

在SQL中舍入为最接近的奇数整数,sql,rounding,Sql,Rounding,我发现自己有点不太可能*需要在SQL中舍入到最接近的奇数整数。对于如何四舍五入到最近的N(2,5,10等),有一个很好的解决方案,但奇数上没有明确的解决方案。如果有专门针对Oracle的解决方案,请使用Oracle 11gR2 *需要将我的数据连接到从此剥离的表。作者使用了一致的箱子宽度2…但有时是偶数,有时是奇数。您可以这样做: DECLARE n FLOAT; BEGIN n := 195.8; SELECT CASE WHEN mod(F

我发现自己有点不太可能*需要在SQL中舍入到最接近的奇数整数。对于如何四舍五入到最近的N(2,5,10等),有一个很好的解决方案,但奇数上没有明确的解决方案。如果有专门针对Oracle的解决方案,请使用Oracle 11gR2


*需要将我的数据连接到从此剥离的表。作者使用了一致的箱子宽度2…但有时是偶数,有时是奇数。

您可以这样做:

DECLARE
  n FLOAT;
BEGIN  
   n := 195.8;
   SELECT 
      CASE
         WHEN mod(FLOOR(n),2) = 0 THEN FLOOR(n)+1
         ELSE FLOOR(n)
      END NUM
      INTO n
   FROM DUAL;
   dbms_output.put_line(to_char(n));
   END;
/

有时,直接前进是最好的,因为跟随你的人会明白发生了什么。

使用模数可以帮助你找到奇偶数。偶数加1

select
    case when (value % 2) <> 0 then value
    else value + 1 end
from table
选择
(值%2)为0时的情况,然后为值
else值+1结束
从桌子上
算术还是

ROUND(3.14,0)|1
编辑


安德烈正确地将此更正为
地板(3.64)::int | 1
。(有效)。

下面是一个oracle PL/SQL函数,它可以做到这一点:

CREATE OR REPLACE FUNCTION ROUNDODD 
(
  IMPNUM IN NUMBER  
) RETURN NUMBER AS
roundnum number;
oddnum number;
BEGIN
roundnum := round (IMPNUM,0);

IF mod(roundnum,2) = 1
THEN RETURN roundnum;
ELSE
IF roundnum > IMPNUM
THEN RETURN roundnum-1;
ELSE RETURN roundnum+1;
end if;
end if;
END ROUNDODD;

我认为您不需要案例陈述,这应该可以做到:

SELECT 
   ROUND((11.9-1)/2,0)*2+1
FROM DUAL

可能遗漏了一些东西,但不确定这是否有效-它从195.8到197,在我的“四舍五入到最接近的奇数”下,我希望它转到195。@Andrew-是的,我误解了要求。请参阅最新的编辑。我在SQL developer中对其进行了测试,它似乎可以处理我所能想到的所有积极案例。DCP的答案通过您的测试案例了吗?在我的数据上行为不端。对不起,你说的DCP是什么意思?应该更清楚-这条线索上的另一个答案不,他的脚本没有解释像15.9这样的数字,他缺少一个案例来检查舍入的数字是否大于输入的数字,因此减一而不是加一,但不正确。1.
|
的两个操作数都应该是
int
(您的
ROUND()
的结果不是)。2.您认为
ROUND(3.64,0)::int | 1
的计算结果是什么?嗯,
FLOOR()
不接受第二个参数,但是,顺便说一句。顺便问一下,我有没有告诉过你,它是测试像你这样的小型解决方案的一个很好的工具?:)不过,请注意,
TRUNC()
FLOOR()
在负片上的作用不同,因为严格来说,它们执行不同的功能:后者将值向下舍入到最接近的整数,而前者只是截断指定小数位数后的部分(或者,如果未指定,则只截断小数部分)。因此,
FLOOR(-3.64)
的计算结果为
-4
(因为
-4<-3.64
),而
TRUNC(-3.64)<代码> >代码> - 3 < /代码>。如果否定是可能的,这是应该考虑的。Andriy,感谢SQLFIDLE上的提示。显然,我没有回答SQL问题的答案;啊,但是我仍然认为你使用按位<代码>或< /代码>的想法是伟大的。既然您已经添加了一个有效的解决方案,那么这个值应该是+1。干得好