我有多种类型Decimal(8, 2)
,并且一直使用Substring
来获取小数值。
E.g.)
declare @val decimal(8, 2), @strVal varchar(10)
set @val = 15.80
set @strVal = cast(@val as varchar)
select @val, substring(@strVal, charindex('.', @strVal), len(@strVal))
是否有更好的方法可以简单地从.80
获取小数值@val
而无需将其转换为字符?
我想知道是否有一个内置的UDF(用户定义函数)可以解析而不必推出我自己的版本。
答案 0 :(得分:8)
使用模数(%)运算符。你会得到0.80
。
像这样:
declare @val decimal(8, 2)
set @val = 15.80
select @val, @val % 1
答案 1 :(得分:2)
我认为你的意思是小数值,而不是小数值。你已经有了十进制值。要获取小数值,请使用Round或Floor函数
Declare @Fraction Decimal(8,2)
Set @Fraction = @Val - Floor(@Val)
或
Set @Fraction = @Val - Round(@Val, 0)
答案 2 :(得分:1)
SET @val = (@val - ROUND(@val, 0, 1) * 100)
ROUND(@val,0,1)应将15.80截断为15.00。然后从15.80中减去15,然后将0.80乘以100得到数字形式的80.
ROUND函数要求将第三个参数设置为1来截断数字。否则,它会将15.80转换为16.00。请参阅:http://msdn.microsoft.com/en-us/library/ms175003.aspx。
答案 3 :(得分:0)
对于那些只想返回小数值的人...(即没有小数),SQLMenace使用本文中的PARSENAME发布了一个很好的方法:How To Get Only Numbers After Decimal
使用前的重要注意事项:如果它们是无小数SELECT PARSENAME((22),2)将返回NULL ...并且SELECT PARSENAME((22),1)将仅返回整数...这可以很容易被COALESCE处理或检查零模数......但它在所有用途中可能都不实用
SELECT PARSENAME((22.777),1) -- Returns ONLY The number after decimal
SELECT PARSENAME((22.777),2) -- Returns ONLY The whole number