【问题标题】:How to convert integer to decimal in SQL Server query?如何在 SQL Server 查询中将整数转换为十进制?
【发布时间】:2012-04-22 19:53:48
【问题描述】:

我的 SQL Server 表中的列 height 是整数类型。我想做一个除法,并在我的查询中将结果作为小数:

Select (height/10) as HeightDecimal

如何进行转换以使HeightDecimal 不再是整数?谢谢。

【问题讨论】:

    标签: sql sql-server type-conversion


    【解决方案1】:
    SELECT height/10.0 AS HeightDecimal FROM dbo.whatever;
    

    如果你想要一个特定的精度刻度,那么就这么说吧:

    SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal
      FROM dbo.whatever;
    

    【讨论】:

    • +1 表示第一部分,但要注意第二个示例。此CONVERT 是在除法后应用的,并且不能超过您已有的 6 位小数。
    • 完美解决方案!!我想第一个表现更好!不是吗?
    • @Diablo 好吧,你可以测试一下,但我怀疑你会注意到任何不同。无论如何,如果您需要特定的精度/比例,请在您的应用程序层中进行格式化。
    【解决方案2】:
    SELECT CAST(height AS DECIMAL(18,0)) / 10
    

    编辑:这是如何运作的?

    结果类型与两个参数的类型相同,或者,如果它们不同,则由data type precedence table 确定。因此,您可以将任一参数转换为非整数。

    现在DECIMAL(18,0),或者你可以等效地写成DECIMAL,仍然是一种整数类型,因为0的默认比例意味着“小数点右边没有数字”。因此,在不同的情况下,对它进行强制转换可能会很好地舍入为整数——这与我们试图完成的相反。

    但是,DECIMAL 对所有事物都有自己的规则。它们通常是非整数,但总是精确的数字。我们强制发生的 DECIMAL 除法的结果类型is determined specially 在我们的例子中是 DECIMAL(29,11)。因此,除法的结果将舍入到 11 位,这与除以 10 无关,但除以 3 时,舍入变得可观察到。您可以通过操纵左侧操作数的比例来控制舍入量。您还可以通过在整个表达式周围放置另一个 ROUND 或 CAST 操作来进行更多但不能更少的舍入。

    相同的机制在公认的答案中支配着更简单和更好的解决方案:

      SELECT height / 10.0
    

    在这种情况下,除数的类型是DECIMAL(3,1),结果的类型是DECIMAL(17,6)。尝试除以 3 并观察四舍五入的差异。

    如果您只是讨厌所有关于精度和小数位数的讨论,并且只是希望 SQL Server 从某个时候开始以良好的旧双精度浮点算术执行所有计算,那么您也可以强制这样做:

    SELECT height / CAST(10 AS FLOAT(53))
    

    或者等价的

    SELECT height / CAST (10 AS FLOAT)
    

    【讨论】:

    • 感谢您对精度/比例/长度进行如此详细的解释,并提供如此有用的链接!真的很感激! :)
    【解决方案3】:

    您可以将高度转换为小数:

    select cast(@height as decimal(10, 5))/10 as heightdecimal
    

    或者您在除以的值中放一个小数点:

    declare @height int
    set @height = 1023
    
    select @height/10.0 as heightdecimal
    

    请参阅sqlfiddle 的示例

    【讨论】:

      【解决方案4】:
      select cast (height as decimal)/10 as HeightDecimal
      

      【讨论】:

      • decimal(anything,anything)?为什么不指定?
      • 你是对的除法,但会产生溢出问题,例如乘法。 decimal(h)*10一般不等于decimal(g*10),这样想我就养成了先投再投的习惯
      • 我同意在操作之前进行显式强制转换更好。但我的意思是,如果你要说decimal,你应该说decimal(precision,scale)
      • @AaronBertrand - 这取决于具体情况。在指定数据库模式(尤其是存储过程参数)时,我同意你的看法。然而,证明有用性的责任在于争论特定代码的存在而不是不存在。
      • 如果我是应用程序开发人员并且我需要使用您的查询和/或为其编写一个接口,您难道不想为数据类型指定您的意图,以便我知道会发生什么,而不是让我通过一堆测试和/或追踪你并问你?您是否也出于类似原因省略了char/varchar/nchar/nvarchar 的长度规范?
      【解决方案5】:
      declare @xx int 
      set     @xx = 3 
      select @xx      
      select @xx * 2  -- yields another integer  
      select @xx/1    -- same
      select @xx/1.0  --yields 6 decimal places 
      select @xx/1.00 --       6 
      select @xx * 1.0  --     1 decimal place - victory
      select @xx * 1.00 --     2         places - hooray 
      

      还 _ 将 int 插入到 temp_table 中,使用类似 decimal(10,3) _ 可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2012-07-07
        相关资源
        最近更新 更多