У меня есть число типа 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 (определяемая пользователем функция ), который будет анализировать вместо развертывания моей собственной версии.
Ответ 1 · рейтинг 9 · Nathan Wheeler
Используйте оператор модуля (%). Вы получите 0.80.
Так:
declare @val decimal(8, 2)
set @val = 15.80
select @val, @val % 1
Ответ 2 · рейтинг 2 · Charles Bretana
Я думаю, вы имеете в виду дробное значение, а не десятичное значение. У вас уже есть десятичное значение. Чтобы получить дробное значение, используйте Round, или функции Floor
Declare @Fraction Decimal(8,2)
Set @Fraction = @Val - Floor(@Val)
or
Set @Fraction = @Val - Round(@Val, 0)
Ответ 3 · рейтинг 1 · Daniel Vassallo
SET @val = (@val - ROUND(@val, 0, 1) * 100)
ROUND(@val, 0, 1) должен обрезать 15,80 до 15,00. Затем вы вычитаете 15 из 15,80 и умножаете 0,80 на 100, чтобы получить 80 в числовой форме.
Функция ОКРУГЛ требует, чтобы третий параметр был установлен в 1, чтобы усечь число. В противном случае он преобразовал бы 15,80 в 16,00. См.: http://msdn.microsoft.com/en-us/library/ms175003.aspx.
Ответ 4 · Anthony Griggs
Для тех, кто хочет вернуть только дробное значение... (т.е. без десятичного числа), 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