SQL - 如何仅获取小数点后的数字?

时间:2010-08-05 19:51:23

标签: sql sql-server tsql

如何只获得小数点后的数字?

示例:2.938 = 938

12 个答案:

答案 0 :(得分:121)

试试这个:

SELECT (num % 1)

答案 1 :(得分:52)

单向,也适用于负值

declare @1 decimal(4,3)
select @1 = 2.938

select PARSENAME(@1,1)

答案 2 :(得分:14)

您可以使用FLOOR

select x, ABS(x) - FLOOR(ABS(x))
from (
    select 2.938 as x
) a

<强>输出:

x                                       
-------- ----------
2.938    0.938

或者您可以使用SUBSTRING

select x, SUBSTRING(cast(x as varchar(max)), charindex(cast(x as varchar(max)), '.') + 3, len(cast(x as varchar(max))))
from (
    select 2.938 as x
) a

答案 3 :(得分:6)

更通用的方法可能是合并PARSENAME和%运算符。 (正如上面两个答案中所回答的那样)

按照SQLMenace上述第一种方法的结果

select PARSENAME(0.001,1) 

结果:001

select PARSENAME(0.0010,1) 

结果:0010

select PARSENAME(-0.001,1)

结果:001

select PARSENAME(-1,1)

结果:-1 - &gt;不应该返回整数部分

select PARSENAME(0,1)

结果:0

select PARSENAME(1,1)

结果:1​​ - &gt;不应该返回整数部分

select PARSENAME(100.00,1)

结果:00

Pavel Morshenyuk根据上述第一种方法得出的结果 “0”。在这种情况下是结果的一部分。

SELECT (100.0001 % 1)

结果:0.0001

SELECT (100.0010 % 1)

结果:0.0010

SELECT (0.0001 % 1)

结果:0.0001

SELECT (0001 % 1)

结果:0

SELECT (1 % 1)

结果:0

SELECT (100 % 1)

结果:0

结合两者:

SELECT PARSENAME((100.0001 % 1),1)

结果:0001

SELECT PARSENAME((100.0010 % 1),1)

结果:0010

SELECT PARSENAME((0.0001 % 1),1)

结果:0001

SELECT PARSENAME((0001 % 1),1)

结果:0

SELECT PARSENAME((1 % 1),1)

结果:0

SELECT PARSENAME((100 % 1),1)

结果:0

但仍然存在的一个问题是在非零数字是结果的一部分之后为零(例如:0.0010 - > 0010)。可能必须应用一些其他逻辑来删除它。

答案 4 :(得分:4)

通常的hack(语法略有不同)是

x - floor(x)

这是小数部分。要制作整数,请缩放它。

(x - floor(x)) * 1000

答案 5 :(得分:1)

通过查询使其变得非常简单:

select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;

将您的号码或列名改为123.122

答案 6 :(得分:1)

我遇到了同样的问题,并使用'%'运算符解决了该问题:

select 12.54 % 1;

答案 7 :(得分:0)

如果你知道你想要的值是千分之一,那就放置它吧

SELECT (num - FLOOR(num)) * 1000 FROM table...;

答案 8 :(得分:0)

如果您只想选择十进制数,请使用此WHERE子句:

    (CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT)) <> 0

如果你想要一个清晰的清单,你可以按十进制/整数排序:

    CASE WHEN 0 = CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type

答案 9 :(得分:0)

X-TRUNC(X),也适用于负片。

它将为您提供数字的小数部分,即双精度而非整数。

答案 10 :(得分:-1)

你可以使用RIGHT:

 select RIGHT(123.45,2) return => 45

答案 11 :(得分:-2)

CAST(右(MyField,LEN(MyField)-CHARINDEX('。',MyField)+1)AS FLOAT)