DB 中的向上舍入和向下舍入问题

时间:2021-05-24 13:54:52

标签: sql oracle vertica

您好,我想编写一个函数来对如下值进行四舍五入:

样本数据

select cast(22.5 as decimal(18,0))   --- > 22
select cast(22.51 as decimal(18,0))  --- > 23
select cast(22.49 as decimal(18,0)) --- > 22

我无法使用 round 函数实现要求,因为当值为 XX.5 时,它没有返回我预期的输出

select round(22.5) from dual;
Output: 23
But I need here 22.

谁能帮我实现这个要求。

3 个答案:

答案 0 :(得分:1)

您可以在 MOD 表达式中使用 CASE 检查小数部分,然后使用 CEILFLOOR

SELECT value,
       CASE
       WHEN MOD(value, 1) > 0.5
       THEN CEIL(value)
       ELSE FLOOR(value)
       END AS rounded
FROM   table_name;

对于样本数据:

CREATE TABLE table_name ( value ) AS
SELECT 22.4 + 0.01 * ( LEVEL - 1 )
FROM   DUAL
CONNECT BY LEVEL <= 20;

输出:

<块引用>
<头>
VALUE 圆形
22.4 22
22.41 22
22.42 22
22.43 22
22.44 22
22.45 22
22.46 22
22.47 22
22.48 22
22.49 22
22.5 22
22.51 23
22.52 23
22.53 23
22.54 23
22.55 23
22.56 23
22.57 23
22.58 23
22.59 23

db<>fiddle here

答案 1 :(得分:0)

首先,你不能做你在问题中指定的事情。 decimal(18, 0) 没有小数点。所以这三个值只是 23、23 和 22,没有小数点。让我假设您打算将 decimal(18, 2) 作为数据类型。

我建议:

select ceil(val + 0.5) - 1

Here 是一个 db<>fiddle。

答案 2 :(得分:0)

首先是decimal(18,0) 不会将其转换为有效的小数,它会转换为整数。我认为最好将其转换为整数,但将其转换为任何整数会将 23.1 和 23.9 之间的所有值转换为 23,这在您的情况下不起作用。有一个 ROUND 函数,但它会转换如下

select ROUND(22.51) --- > 23 -- 如果以 .5 结尾,ROUND 会将小数四舍五入到下一个更高的数字

因此,适合您的情况的最佳解决方案是 FLOOR。如果数字以 0.5 结尾,FLOOR 将向下舍入到下一个最低值

选择楼层(22.51) --- > 22

相关问题