Discussion:
Ermittlung Anzahl Nachkommastellen via SQL
(zu alt für eine Antwort)
Thomas Ostermann
2005-07-04 16:21:19 UTC
Permalink
Hallo Newsgroup,

wie kann ich in einem SQL Skript die Anzahl der Nachkommastellen eines
Feldes vom Typ money ermitteln?

Beispiel:

1,2345 -> Rückgabe 4
1,22 -> Rückgabe 2
1 -> Rückgabe 0

Gibt es da irgendeine Möglichkeit?

Besten Dank im voraus und viele Grüße,
Thomas Ostermann
Christian Donner
2005-07-04 21:09:01 UTC
Permalink
Post by Thomas Ostermann
Hallo Newsgroup,
wie kann ich in einem SQL Skript die Anzahl der Nachkommastellen eines
Feldes vom Typ money ermitteln?
1,2345 -> Rückgabe 4
1,22 -> Rückgabe 2
1 -> Rückgabe 0
Gibt es da irgendeine Möglichkeit?
Besten Dank im voraus und viele Grüße,
Thomas Ostermann
1. Der Datentyp money hat immer 4 Nachkommastellen:
declare @v1 money, @v2 money, @v3 money, @v4 money, @v5 money
set @v1 = 12.1234
set @v2 = 12.123
set @v3 = 12.12
set @v4 = 12.1
set @v5 = 12
select @v1, @v2, @v3, @v4, @v5

Die Anzahl der Nachkommastellen kann demnach mit

select '4' as Nachkommastellen

ermittelt werden ;-)

Bei anderen Datentypen kann man die Zahl in einen String umwandeln und den
rechten Teil hinter dem Komma isolieren:

declare @v1 float, @strAblage varchar(32)
set @v1 = 3.141529
set @strAblage = cast(@v1 as varchar(32))
set @strAblage = right(@strAblage, len(@strAblage) - charindex('.',
@strAblage))
select @strAblage, len(@strAblage) as Nachkommastellen
Frank Kalis
2005-07-05 08:08:01 UTC
Permalink
Post by Christian Donner
Bei anderen Datentypen kann man die Zahl in einen String umwandeln und den
@strAblage))
Dummerweise hast Du mit FLOAT den wahrscheinlich schlechtesten aller
möglichen numerischen Datentypen für Dein Beispiel gewählt. Dein Statement
liefert inkorrekte Ergebnisse. ;-)

Offensichtlich sollte als Ergebnis eine 6 zurückkommen, da @v1 ebendiese
Anzahl an Nachkommastellen hat. Durch die Konvertierung von FLOAT in VARCHAR
findet intern eine Rundung statt, die teilweise signifikante Nachkommastellen
"abschneidet" und standardmäßig auch nur mit 6 Nachkommastellen gearbeitet
wird. Dies ist "by Design" ist und kann manchmal ziemlich ärgerlich sein.
Jedenfalls führt dies dazu, daß Dein Statement 5 als Anzahl der
Nachkommastellen zurückgibt.

Es gibt aber einen einfachen Workaround hierfür:

DECLARE @v1 FLOAT
SET @v1 = 3.141529
SELECT
LTRIM(CAST(@v1 - CAST(@v1 AS INT )AS FLOAT )) AS Fractional_Part
, RIGHT(LTRIM(@v1 - CAST(@v1 AS INT)),LEN(@v1)-CHARINDEX('.', @v1)+1) AS
Decimal_Places
, LEN(RIGHT(LTRIM(@v1 - CAST(@v1 AS INT)),LEN(@v1)-CHARINDEX('.', @v1)+1))
AS Len_of_Decimal_Places

Fractional_Part Decimal_Places Len_of_Decimal_Places
---------------------- ---------------------- ---------------------
0.141529 141529 6

(1 row(s) affected)

Diese Konvertierung ist ziemlich statisch und wird zunehmend kniffliger,
wenn die Anzahl der Nachkommastellen über 10 hinausgeht.

Generell mal ganz abgesehen davon, das sich mir im Moment der Sinn dieser
Frage hier nicht vollkommen erschließt. :-O
--
Frank Kalis
Microsoft SQL Server MVP
http://www.insidesql.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Loading...