Подтвердить что ты не робот

SQL - Как получить только числа после десятичного числа?

Как получить только числа после десятичного числа?

Пример: 2.938= 938

4b9b3361

Ответ 1

в одну сторону, работает и для отрицательных значений

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

select PARSENAME(@1,1)

Ответ 2

попробуйте следующее:

SELECT (num % 1)

Ответ 3

Вы можете использовать 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

Ответ 4

Обычный хак (который немного отличается от синтаксиса)

x - floor(x)

Это дробная часть. Чтобы сделать в целое число, масштабируйте его.

(x - floor(x)) * 1000

Ответ 5

Более общий подход может заключаться в объединении 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). Может быть, нужно применить другую логику, чтобы удалить это.

Ответ 6

Если вы знаете, что хотите значения тысячных, поместите его,

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

Ответ 7

Сделайте это очень просто по запросу:

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

Вместо этого введите вместо этого номер или столбец 123.122

Ответ 8

Если вы хотите выбрать только десятичные числа, используйте это предложение 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

Вы можете использовать ПРАВО:

 select RIGHT(123.45,2) return => 45

Ответ 10

CAST (RIGHT (MyField, LEN (MyField) -CHARINDEX ('.', MyField) +1) AS FLOAT)