/ / Jaki byłby niezawodny sposób na uzyskanie wartości ułamkowej z liczby? - sql, sql-server, sql-server-2005, tsql, sql-server-2008

Jaki byłby niezawodny sposób na uzyskanie wartości ułamkowej z liczby? - sql, sql-server, sql-server-2005, tsql, sql-server-2008

Mam numer typu Decimal(8, 2) i używali Substring aby uzyskać wartość ułamkową.

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))

Czy istnieje lepszy sposób na uzyskanie po prostu wartości ułamkowej, .80 od @val bez konieczności konwersji na postać?
Zastanawiam się, czy istnieje wbudowany UDF (funkcja zdefiniowana przez użytkownika), który byłby parsowany zamiast konieczności rozwijania mojej własnej wersji.

Odpowiedzi:

8 dla odpowiedzi № 1

Użyj operatora modulus (%). Dostaniesz 0.80.

Lubię to:

declare @val decimal(8, 2)
set     @val = 15.80
select  @val, @val % 1

2 dla odpowiedzi nr 2

Myślę, że masz na myśli wartość ułamkową, a nie dziesiętną. Masz już dziesiętną wartość. Aby uzyskać wartość ułamkową, użyj Okrągły, lub Podłoga Funkcje

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

lub

  Set @Fraction = @Val - Round(@Val, 0)

1 dla odpowiedzi nr 3
SET @val = (@val - ROUND(@val, 0, 1) * 100)

ROUND (@val, 0, 1) powinien skrócić 15,80 do 15.00. Następnie odejmij 15 od 15,80 i pomnóż 0,80 na 100, aby uzyskać 80 w postaci liczbowej.

Funkcja ROUND wymaga trzeciego parametru ustawionego na 1, aby obciąć numer. W przeciwnym razie przeliczałby on 15,80 na 16.00. Widzieć: http://msdn.microsoft.com/en-us/library/ms175003.aspx.


0 dla odpowiedzi nr 4

Dla tych, którzy chcą zwrócić wartość ułamkową tylko ... (tj. Bez separatora dziesiętnego) SQLMenace zamieścił świetny sposób, aby zrobić to za pomocą PARSENAME z tego artykułu: Jak uzyskać tylko liczby po przecinku

WAŻNA UWAGA przed użyciem: Jeśli ich liczba nie jest dziesiętna, WYBIERZ PARSENAME ((22), 2) zwróci NULL ... A WYBIERZ PARSENAME ((22), 1) zwróci tylko liczbę całkowitą ... To może być łatwo obsługiwane przez COALESCE lub sprawdzanie, czy moduł zerowy ... ale może nie być praktyczne we wszystkich zastosowaniach

SELECT PARSENAME((22.777),1) -- Returns ONLY The number after decimal
SELECT PARSENAME((22.777),2) -- Returns ONLY The whole number