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

use*_*432 44 sql t-sql sql-server

我如何只得到小数点后的数字?

示例:2.938=938

Pav*_*yuk 126

试试这个:

SELECT (num % 1)
Run Code Online (Sandbox Code Playgroud)

  • 只有当DECIMAL为num时,似乎才有效.当num是FLOAT时,我失败了. (10认同)

SQL*_*ace 56

one way, works also for negative values

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

select PARSENAME(@1,1)
Run Code Online (Sandbox Code Playgroud)

  • 不能是int,因为int将忽略前0,使用varchar,示例DECLARE @Remainder varchar(10)DECLARE @NotWorked DECIMAL(5,3)SET @NotWorked =(144/4380.0)SELECT @Remainder = PARSENAME( @ NotWorked,1)选择@Remainder - 见033 (3认同)
  • 如果在小数点后面传递一个带零的浮点变量,则不起作用.例如,`DECLARE @AMT FLOAT SET @AMT = 3881.00 SELECT PARSENAME(@ AMT,1)`它返回'3881`.好的,所以我看到你明确地将变量声明为十进制,但我认为它应该仍然被设想. (3认同)
  • 那么,如果值是.042,那么它只返回42怎么办? (2认同)
  • 我不知道您的电话号码是多少,但尝试使用此DECLARE @NotWorked DECIMAL(5,3)SET @NotWorked =(144 / 4380.0)选择PARSENAME(@ NotWorked,1),它会给我033 (2认同)
  • 如果没有小数部分,它将不起作用。示例:select PARSENAME(1,1)返回1。这是错误的,理想情况下应返回0或空白或null (2认同)

Red*_*ter 18

You can use FLOOR:

select x, ABS(x) - FLOOR(ABS(x))
from (
    select 2.938 as x
) a
Run Code Online (Sandbox Code Playgroud)

Output:

x                                       
-------- ----------
2.938    0.938
Run Code Online (Sandbox Code Playgroud)

Or you can use 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
Run Code Online (Sandbox Code Playgroud)

  • 添加了[ABS](http://msdn.microsoft.com/en-us/library/ms189800%28SQL.90%29.aspx)来处理负数...... (3认同)

Tej*_*gde 7

更通用的方法可能是合并PARSENAME和%运算符.(如上面两个答案所述)

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

select PARSENAME(0.001,1) 
Run Code Online (Sandbox Code Playgroud)

结果:001

select PARSENAME(0.0010,1) 
Run Code Online (Sandbox Code Playgroud)

结果:0010

select PARSENAME(-0.001,1)
Run Code Online (Sandbox Code Playgroud)

结果:001

select PARSENAME(-1,1)
Run Code Online (Sandbox Code Playgroud)

结果:-1 - >不应返回整数部分

select PARSENAME(0,1)
Run Code Online (Sandbox Code Playgroud)

结果:0

select PARSENAME(1,1)
Run Code Online (Sandbox Code Playgroud)

结果:1 - >不应返回整数部分

select PARSENAME(100.00,1)
Run Code Online (Sandbox Code Playgroud)

结果:00

按照Pavel Morshenyuk上述第一种方法的结果"0".在这种情况下是结果的一部分.

SELECT (100.0001 % 1)
Run Code Online (Sandbox Code Playgroud)

结果:0.0001

SELECT (100.0010 % 1)
Run Code Online (Sandbox Code Playgroud)

结果:0.0010

SELECT (0.0001 % 1)
Run Code Online (Sandbox Code Playgroud)

结果:0.0001

SELECT (0001 % 1)
Run Code Online (Sandbox Code Playgroud)

结果:0

SELECT (1 % 1)
Run Code Online (Sandbox Code Playgroud)

结果:0

SELECT (100 % 1)
Run Code Online (Sandbox Code Playgroud)

结果:0

结合两者:

SELECT PARSENAME((100.0001 % 1),1)
Run Code Online (Sandbox Code Playgroud)

结果:0001

SELECT PARSENAME((100.0010 % 1),1)
Run Code Online (Sandbox Code Playgroud)

结果:0010

SELECT PARSENAME((0.0001 % 1),1)
Run Code Online (Sandbox Code Playgroud)

结果:0001

SELECT PARSENAME((0001 % 1),1)
Run Code Online (Sandbox Code Playgroud)

结果:0

SELECT PARSENAME((1 % 1),1)
Run Code Online (Sandbox Code Playgroud)

结果:0

SELECT PARSENAME((100 % 1),1)
Run Code Online (Sandbox Code Playgroud)

结果:0

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


Ren*_*ato 6

我遇到了同样的问题并用“%”运算符解决了:

select 12.54 % 1;
Run Code Online (Sandbox Code Playgroud)


S.L*_*ott 5

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

x - floor(x)
Run Code Online (Sandbox Code Playgroud)

那是分数部分。要使其成为整数,请对其进行缩放。

(x - floor(x)) * 1000
Run Code Online (Sandbox Code Playgroud)