如何在SQL Server查询中将整数转换为十进制?

RJI*_*IGO 42 sql sql-server type-conversion

height我的SQL Server表中的列是整数类型.我想进行除法,并在查询中将结果作为十进制:

Select (height/10) as HeightDecimal
Run Code Online (Sandbox Code Playgroud)

如何投射以使其HeightDecimal不再是整数?谢谢.

Aar*_*and 66

SELECT height/10.0 AS HeightDecimal FROM dbo.whatever;
Run Code Online (Sandbox Code Playgroud)

如果你想要一个特定的精度标度,那么这样说:

SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal
  FROM dbo.whatever;
Run Code Online (Sandbox Code Playgroud)

  • 第一部分为+1,但要注意第二个例子.这个`CONVERT`是在分割后应用的,不能给你超过你已经有的6个小数位. (7认同)

Jir*_*ika 20

SELECT CAST(height AS DECIMAL(18,0)) / 10
Run Code Online (Sandbox Code Playgroud)

编辑: 如何在引擎盖下工作?

结果类型与两个参数的类型相同,或者,如果它们不同,则由数据类型优先级表确定.因此,您可以将任一参数转换为非整数.

现在DECIMAL(18,0),或者你可以等效地写,只是DECIMAL一种整数类型,因为默认的比例0意味着"小数点右边没有数字".因此,在不同的情况下,它可能适用于四舍五入到整数 - 这与我们想要完成的事情相反.

但是,DECIMAL对所有事情都有自己的规则.它们通常是非整数,但总是精确的数字.我们强制发生的DECIMAL分区的结果类型特别确定为DECIMAL(29,11).因此,除法的结果将舍入到11个位置,不考虑除以10,但是当除以3时,舍入变得可观察.您可以通过操纵左手操作数的比例来控制舍入量.您还可以通过在整个表达式周围放置另一个ROUND或CAST操作来舍入更多但不能更少的内容.

相同的机制在接受的答案中支配更简单,更好的解决方案:

  SELECT height / 10.0
Run Code Online (Sandbox Code Playgroud)

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

如果您只是讨厌所有关于精度和标度的讨论,并且只是希望SQL服务器从某个角度开始在旧的双精度浮点运算算法中执行所有计算,那么您也可以强制执行:

SELECT height / CAST(10 AS FLOAT(53))
Run Code Online (Sandbox Code Playgroud)

或者等同于

SELECT height / CAST (10 AS FLOAT)
Run Code Online (Sandbox Code Playgroud)