web-dev-qa-db-ger.com

SQL - Wie bekomme ich nur die Nachkommastellen?

Wie bekomme ich nur die Nachkommastellen?

Beispiel: 2.938 = 938

41
user380432

einweg funktioniert auch bei negativen Werten

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

select PARSENAME(@1,1)
50
SQLMenace

versuche dies:

SELECT (num % 1)
115

Sie können FLOOR verwenden:

select x, ABS(x) - FLOOR(ABS(x))
from (
    select 2.938 as x
) a

Ausgabe:

x                                       
-------- ----------
2.938    0.938

Oder Sie können SUBSTRING verwenden:

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
13
RedFilter

Ein allgemeinerer Ansatz kann das Zusammenführen von PARSENAME und dem Operator% sein. (wie oben in zwei Antworten beantwortet)

Ergebnisse gemäß 1. Ansatz von SQLMenace

select PARSENAME(0.001,1) 

Ergebnis: 001

select PARSENAME(0.0010,1) 

Ergebnis: 0010

select PARSENAME(-0.001,1)

Ergebnis: 001

select PARSENAME(-1,1)

Ergebnis: -1 -> Sollte keine Ganzzahl zurückgeben

select PARSENAME(0,1)

Ergebnis: 0 

select PARSENAME(1,1)

Ergebnis: 1 -> Sollte keine Ganzzahl zurückgeben

select PARSENAME(100.00,1)

Ergebnis: 00

Ergebnisse gemäß 1. Ansatz von Pavel Morshenyuk "0." ist in diesem Fall Teil des Ergebnisses.

SELECT (100.0001 % 1)

Ergebnis: 0,0001

SELECT (100.0010 % 1)

Ergebnis: 0,0010

SELECT (0.0001 % 1)

Ergebnis: 0,0001

SELECT (0001 % 1)

Ergebnis: 0

SELECT (1 % 1)

Ergebnis: 0

SELECT (100 % 1)

Ergebnis: 0

Beides kombinieren: 

SELECT PARSENAME((100.0001 % 1),1)

Ergebnis: 0001

SELECT PARSENAME((100.0010 % 1),1)

Ergebnis: 0010

SELECT PARSENAME((0.0001 % 1),1)

Ergebnis: 0001

SELECT PARSENAME((0001 % 1),1)

Ergebnis: 0

SELECT PARSENAME((1 % 1),1)

Ergebnis: 0

SELECT PARSENAME((100 % 1),1)

Ergebnis: 0

Eine noch verbleibende Ausgabe ist jedoch die Null, nachdem die Nicht-Null-Zahlen Teil des Ergebnisses sind (Beispiel: 0.0010 -> 0010). Möglicherweise muss man eine andere Logik anwenden, um das zu entfernen.

6
Tejasvi Hegde

Der übliche Hack (der in der Syntax ein bisschen variiert) ist 

x - floor(x)

Das ist der Bruchteil. Um eine Ganzzahl zu erhalten, skalieren Sie diese.

(x - floor(x)) * 1000
4
S.Lott

Machen Sie es durch Abfrage sehr einfach:

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

Geben Sie stattdessen Ihre Nummer oder Ihren Spaltennamen ein. 123.122

1
user2412524

X - TRUNC (X) funktioniert auch für Negative.

Sie erhalten den Dezimalteil der Zahl als Double und nicht als Integer.

0
MrPmosh

Wenn Sie wissen, dass Sie die Werte bis zum Tausendstel wollen, dann ist es

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

Wenn Sie nur Dezimalzahlen auswählen möchten, verwenden Sie diese WHERE-Klausel:

    (CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT)) <> 0

Wenn Sie eine klare Liste wünschen, können Sie nach Dezimalzahl/Ganzzahl sortieren:

    CASE WHEN 0 = CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type
0
Jonas Fermefors