Sql 从数字中获取分数的可靠方法是什么?

Sql 从数字中获取分数的可靠方法是什么?,sql,sql-server,sql-server-2005,tsql,sql-server-2008,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server 2008,我有许多类型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)) 有没有更好的方法可以直接

我有许多类型
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))
有没有更好的方法可以直接从
@val
获取分数值
.80
,而无需将其转换为字符?


我想知道是否有一个内置的UDF(用户定义函数),它可以解析而不必推出我自己的版本。

我想你指的是小数,而不是小数。您已经有了十进制值。要获取分数值,请使用或函数

  Declare @Fraction Decimal(8,2)
  Set @Fraction = @Val - Floor(@Val)

该轮(@val,0,1)应将15.80截断为15.00。然后从15.80中减去15,然后将0.80乘以100得到数字形式的80

ROUND函数要求将第三个参数设置为1以截断数字。否则,它会将15.80转换为16.00。请参阅:.

使用模数(%)运算符。您将获得
0.80

像这样:

declare @val decimal(8, 2)
set     @val = 15.80
select  @val, @val % 1

对于那些只想返回小数的人。。。(即,不带小数点)SqlNemage使用本文中的PARSENAME发布了一个很好的方法:

使用前的一个重要注意事项:如果它们的值不是十进制的,则SELECT PARSENAME((22),2)将返回NULL。。。并选择PARSENAME((22),1)将只返回整数。。。这可以通过合并或检查零模量来轻松处理。。。但它并非在所有用途中都实用

SELECT PARSENAME((22.777),1) -- Returns ONLY The number after decimal
SELECT PARSENAME((22.777),2) -- Returns ONLY The whole number

你的问题毫无意义。你有一个十进制数,你想把它转换成十进制数???什么??!您已经有了十进制值,在@val中。子字符串正在做的是将分数值作为字符值进行检索。是的,
int
类型的分数值是我试图从中得到的。从15.80开始,我想得到
.80
我还没有研究过数学函数,这看起来是一个简单但可靠的得到分数的方法。谢谢Charles。没问题,请查看这一轮和楼层参考链接,看看它们是如何工作的,以及它们之间的差异……哈,对一个有把手的人来说,这是一个不错的要求,
md5sum
。谢谢。不知道为什么人们总是忽视模运算符。。。我见过一些从十进制值中去掉整数的非常奇怪的方法。
declare @val decimal(8, 2)
set     @val = 15.80
select  @val, @val % 1
SELECT PARSENAME((22.777),1) -- Returns ONLY The number after decimal
SELECT PARSENAME((22.777),2) -- Returns ONLY The whole number