在 SQL Server 中舍入到最接近的 5

问题描述 投票:0回答:7

我的 SQL Server 2008 表中有一个 Money 列。在我下面的查询中,如何将其四舍五入到最接近的 5$

select FineAmount from tickets

谢谢

sql-server-2008
7个回答
43
投票
select round(FineAmount*2,-1)/2 from tickets

或者将 nicholaides 的建议放入 sql 中

select round(FineAmount/5.0,0)*5 from tickets

该示例假设 FineAmount 是货币类型。 第二种方法可能更好,因为第一种方法适用于 Maximum_value_of_money_type/2 的限制

更多关于圆形


26
投票

通用数学解决方案:

除以 5,四舍五入到最接近的整数,然后乘以 5。


4
投票

如果您想截断(向下舍入)为 5 的分组,请使用模函数;在 Microsoft SQL Server 中,这是

%

即:

field1
- (
field1
% 5)

如果 field1 == 3,那么计算结果为:

3 - (3%5) = 0

如果是13:

13 - (13%5) = 10

如果要四舍五入,只需添加 5 即可

另请参阅“MOD”不是可识别的内置函数名称


1
投票

我的第一个解决方案是

create function dbo.udf_RoundToNearest(@x int, @to int)
returns int
with schemabinding as begin
return @to * convert(int, round(convert(float, @x) / convert(float, @to), 0))
end

这可行,但被 MSSQL 认为是“不精确”,因为它内部使用浮点数。 这会阻止它在索引视图中使用。 您可以只使用整数算术来完成这项工作:

create function dbo.udf_RoundToNearest(@x int, @to int)
returns int
with schemabinding as begin

declare @m int
set @m = abs(@x) % abs(@to)

declare @trunc int
set @trunc = abs(@x) - @m

declare @r int
set @r = case when @m * 2 >= abs(@to) then @trunc + abs(@to) else @trunc end

return case when @x < 0 then -@r else @r end

end

1
投票

舍入到下一个更大的 5

(CAST(@Amount/5 AS INT) + IIF(CAST(ROUND(@Amount,0) AS INT) % 5>1,1,0))*5)

0
投票
DECLARE @Amount DECIMAL(18,3) ; SET @Amount = 7818.32

SELECT(Round((@Amount-CAST(@Amount AS INT))*100 /5,0)*5 /100) 
      + CAST( @Amount AS INT)

--您将获得 7818.30


-10
投票

使用ROUND函数

    SELECT  ROUND(FineAmount,5)
    FROM    tickets
© www.soinside.com 2019 - 2024. All rights reserved.