【发布时间】:2009-11-09 16:21:26
【问题描述】:
我的 SQL Server 2008 表中有一个 Money 列。在我的以下查询中,如何将其四舍五入到最接近的 5 美元
select FineAmount from tickets
谢谢
【问题讨论】:
-
你能定义“最近”吗?即,对于 0、1、2.5 和 4 的值,您想要什么结果?根据用例的不同,四舍五入可能意味着不同的事情。
标签: sql-server-2008
我的 SQL Server 2008 表中有一个 Money 列。在我的以下查询中,如何将其四舍五入到最接近的 5 美元
select FineAmount from tickets
谢谢
【问题讨论】:
标签: sql-server-2008
select round(FineAmount*2,-1)/2 from tickets
或者把nicholaides的建议放到sql中
select round(FineAmount/5,0)*5 from tickets
该示例假定 FineAmount 的类型为 money。 第二种方法可能更好,因为第一种适用于 maximum_value_of_money_type/2 的限制
更多关于ROUND
【讨论】:
一个通用的数学解决方案:
除以 5,四舍五入到最接近的整数,然后乘以 5。
【讨论】:
如果您想截断(向下舍入)到 5 个分组,请使用模函数;在 Microsoft SQL Server 中,这是 %
即:field1 - (field1 % 5)
如果你有 field1 == 3,那么计算结果是:
3 - (3 % 5) = 0
如果是 13:
13 - (13 % 5) = 10
如果要四舍五入,只需加 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
【讨论】:
我的第一个解决方案是
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)
【讨论】:
使用 ROUND 函数
SELECT ROUND(FineAmount,5)
FROM tickets
【讨论】:
ROUND重载中的整数值是表示十进制精度,不是取整的倍数。