Frage

Ich will ein Geld-Datentyp in eine Dezimalzahl konvertieren, weil ich die Ergebnisse auf 8 Dezimalstellen aufnehmen möchten.

Zum Beispiel in einer Währungskurstabelle I die Rate als 2871047428,20 als Gelddatentyp gespeichert sehen; mit Microsoft SQL Management Studio, möchte ich, dass, um von 10000000 teilen Sie das Ergebnis zu erreichen 287.10474282; aber das Ergebnis, das ich eigentlich bin immer ist 287,1047.

Ich glaube, der Grund, warum ich immer bin nur die vier Dezimalstellen ist, weil es Geld-Datentyp ist, und deshalb glaube ich, der richtige Weg, dies zu einem Dezimal-Datentyp zu konvertieren ist ....

War es hilfreich?

Lösung

Hier ist ein Vergleich linken Spalte der Dezimalwert, rechte Spalte der berechnete Geldwert:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000

Siehe auch hier auf Stack-Überlauf:

Andere Tipps

splattne Antwort ist fast richtig, bis auf zwei kleinere Änderungen:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,6)) / 10000000.0, @money / 10000000.0

Damit wird die richtige Antwort geben: 287,10474282. Was ich tat, ist die Präzision Wert zu verändern und das Hinzufügen der“0,0" auf den Teilungswert.

Das einzige, was mir jetzt ein Rätsel ist die Tatsache, dass ich den Wert als Dezimalzahl zu werfen habe (34,6) anstelle der erwarteten dezimal (34,8).

Also, ich schrieb die Abfrage auf eine andere Weise, die mehr Sinn für mich macht:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST((@money / 10000000.0) AS decimal(34,8)), @money / 10000000.0

Bitte sehen, welche für Sie arbeiten.

Sie sind alle Merkwürdigkeiten Dezimalteilung schlagen Hier ist meine Antwort auf einem anderen Thread, T-SQL Dezimalteilung Genauigkeit

Und können Sie implizite Schwimmer Umwandlungen haben wegen Datentyp Vorrang , wenn Sie verwenden 10.000.000,0

DECLARE @money AS money
SET @money = 2871047428.20
--Oddities
SELECT
    CAST(@money AS decimal(34,8)) / 10000000,
    CAST(@money AS decimal(34,8)) / 10000000.0,
    CAST(@money AS decimal(34,8)) / 10000000.00,
    CAST(@money AS decimal(34,8)) / 10000000.000,
    CAST(@money AS decimal(34,8)) / 10000000.0000
--Should be safe. My brain hurts if I work through p and s
SELECT
    CAST(@money AS decimal(38,8)) / CAST(10000000 AS decimal(8,0))
    SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top