Pav*_*yuk 126
试试这个:
SELECT (num % 1)
Run Code Online (Sandbox Code Playgroud)
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)
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)
更通用的方法可能是合并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).可能是必须应用一些其他逻辑来删除它.
常见的hack(语法略有不同)是
x - floor(x)
Run Code Online (Sandbox Code Playgroud)
那是分数部分。要使其成为整数,请对其进行缩放。
(x - floor(x)) * 1000
Run Code Online (Sandbox Code Playgroud)