Какой надежный способ получить дробное значение из числа? - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть номер типа Decimal(8, 2), и я использую Substring, чтобы получить дробное значение.

E.g.)
    declare @val decimal(8, 2), @strVal varchar(10)
    set @val = 15.80
    set @strVal = cast(@val as varchar)
    select  @val, substring(@strVal, charindex('.', @strVal), len(@strVal))

Есть ли лучший способ просто получить дробное значение, .80 из @val без преобразования его в символ?
Мне интересно, есть ли встроенная UDF (пользовательская функция), которая будет анализировать вместо того, чтобы выкатывать мою собственную версию.

Ответы [ 4 ]

8 голосов
/ 07 декабря 2009

Используйте оператор модуля (%). Вы получите 0.80.

Как это:

declare @val decimal(8, 2)
set     @val = 15.80
select  @val, @val % 1
2 голосов
/ 07 декабря 2009

Я думаю, что вы имеете в виду дробное значение, а не десятичное значение. У вас уже есть десятичное значение. Чтобы получить дробное значение, используйте Round или Floor functions

  Declare @Fraction Decimal(8,2)
  Set @Fraction = @Val - Floor(@Val)

или

  Set @Fraction = @Val - Round(@Val, 0)
1 голос
/ 07 декабря 2009
SET @val = (@val - ROUND(@val, 0, 1) * 100)

ROUND (@val, 0, 1) должен усечь 15.80 до 15.00. Затем вы вычитаете 15 из 15,80 и умножаете 0,80 на 100, чтобы получить 80 в числовой форме.

Для функции ROUND требуется третий параметр, установленный в 1, для усечения числа. Иначе, это преобразовало бы 15.80 в 16.00. Смотри: http://msdn.microsoft.com/en-us/library/ms175003.aspx.

0 голосов
/ 14 марта 2014

Для тех, кто хочет вернуть только дробное значение ... (т.е. без десятичной дроби) SQLMenace опубликовал отличный способ сделать это, используя PARSENAME из этой статьи: Как получить только цифры после десятичной дроби

ВАЖНОЕ ПРИМЕЧАНИЕ перед использованием: если они не являются десятичными, SELECT PARSENAME ((22), 2) вернет NULL ... И SELECT PARSENAME ((22), 1) вернет только целое число ... Это может легко обрабатывается COALESCE или проверкой на нулевой модуль ... но это может быть нецелесообразно при всех применениях

SELECT PARSENAME((22.777),1) -- Returns ONLY The number after decimal
SELECT PARSENAME((22.777),2) -- Returns ONLY The whole number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...