【问题标题】:Round to nearest 5 in SQL Server在 SQL Server 中四舍五入到最接近的 5
【发布时间】:2009-11-09 16:21:26
【问题描述】:

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

select FineAmount from tickets

谢谢

【问题讨论】:

  • 你能定义“最近”吗?即,对于 0、1、2.5 和 4 的值,您想要什么结果?根据用例的不同,四舍五入可能意味着不同的事情。

标签: sql-server-2008


【解决方案1】:
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 除为小数,而不是整数。您可以将其包装在转换/强制转换中,或向其添加 0,以确保其正常工作。例如select round(FineAmount/5.0,0)*5 从门票中
【解决方案2】:

一个通用的数学解决方案:

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

【讨论】:

    【解决方案3】:

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

    即:field1 - (field1 % 5)

    如果你有 field1 == 3,那么计算结果是:

    3 - (3 % 5) = 0

    如果是 13:

    13 - (13 % 5) = 10

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

    另见'MOD' is not a recognized built-in function name

    【讨论】:

    • 注意“操作数数据类型浮点数对模运算符无效”
    • 但是 10 向上取整是 10-(10%5)+5 = 15 但应该是 10。
    【解决方案4】:
    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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案6】:

        四舍五入到下一个更大的 5

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

        【讨论】:

          【解决方案7】:

          使用 ROUND 函数

              SELECT  ROUND(FineAmount,5)
              FROM    tickets
          

          【讨论】:

          • ROUND重载中的整数值是表示十进制精度,不是取整的倍数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          相关资源
          最近更新 更多