Как получить только числа после десятичного числа?
Пример: 2.938
= 938
Как получить только числа после десятичного числа?
Пример: 2.938
= 938
в одну сторону, работает и для отрицательных значений
declare @1 decimal(4,3)
select @1 = 2.938
select PARSENAME(@1,1)
попробуйте следующее:
SELECT (num % 1)
Вы можете использовать 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
Обычный хак (который немного отличается от синтаксиса)
x - floor(x)
Это дробная часть. Чтобы сделать в целое число, масштабируйте его.
(x - floor(x)) * 1000
Более общий подход может заключаться в объединении 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 → Не следует возвращать целую часть
select PARSENAME(0,1)
Результат: 0
select PARSENAME(1,1)
Результат: 1 → Не следует возвращать целую часть
select PARSENAME(100.00,1)
Результат: 00
Результаты по первому подходу выше Павел Моршенюк "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). Может быть, нужно применить другую логику, чтобы удалить это.
Если вы знаете, что хотите значения тысячных, поместите его,
SELECT (num - FLOOR(num)) * 1000 FROM table...;
Сделайте это очень просто по запросу:
select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;
Вместо этого введите вместо этого номер или столбец 123.122
Если вы хотите выбрать только десятичные числа, используйте это предложение 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
Вы можете использовать ПРАВО:
select RIGHT(123.45,2) return => 45
CAST (RIGHT (MyField, LEN (MyField) -CHARINDEX ('.', MyField) +1) AS FLOAT)