我的 SQL Server 2008 表中有一个 Money 列。在我下面的查询中,如何将其四舍五入到最接近的 5$
select FineAmount from tickets
谢谢
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 的限制
更多关于圆形
通用数学解决方案:
除以 5,四舍五入到最接近的整数,然后乘以 5。
如果您想截断(向下舍入)为 5 的分组,请使用模函数;在 Microsoft SQL Server 中,这是
%
即:
field1
- (field1
% 5)
如果 field1 == 3,那么计算结果为:
3 - (3%5) = 0
如果是13:
13 - (13%5) = 10
如果要四舍五入,只需添加 5 即可
我的第一个解决方案是
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
舍入到下一个更大的 5
(CAST(@Amount/5 AS INT) + IIF(CAST(ROUND(@Amount,0) AS INT) % 5>1,1,0))*5)
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
使用ROUND函数
SELECT ROUND(FineAmount,5)
FROM tickets