Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Welchen Datentyp sollte ich zum Speichern von Geldwerten verwenden?

Papuccino,

Ich empfehle die Typen money und smallmoney nicht, es sei denn, Sie sind sich sicher, dass die einzige Arithmetik, die Sie vorhaben, Addition und Subtraktion ist. Wenn Sie mit Wechselkursen, Prozentsätzen usw. zu tun haben, riskieren Sie echte Probleme mit diesen Typen.

Hier ist nur ein kleines Beispiel, um Ihnen den Unterschied zwischen der Verwendung von Geld, Dezimalzahlen und Gleitkommazahlen zu zeigen, wenn es um Divisionen geht. Es ist möglich, Beispiele zu finden, bei denen der Unterschied viel dramatischer ist.

declare @m1 money, @m2 money, @m3 money
declare @d1 decimal(19,4), @d2 decimal(19,4), @d3 decimal(19,4)
declare @f1 float, @f2 float, @f3 float;
set @m1 = 1.00;
set @m2 = 345.00;
set @m3 = @m1/@m2;
set @d1 = 1.00;
set @d2 = 345.00;
set @d3 = @d1/@d2;
set @f1 = 1.00;
set @f2 = 345.00;
set @f3 = @f1/@f2;
select @m3, @d3, @f3;

Ergebnis:0,0028 0,0029 0,00289855072463768

Je nach Branche kann es Richtlinien oder Vorschriften geben, die Ihnen bei der Entscheidung für den richtigen Datentyp helfen. Es gibt nicht die eine richtige Antwort.

Hinzugefügte Anmerkungen:

Sie haben Recht, dass Geld/Geld nicht Geld sein sollte, aber SQL Server erzeugt (unerklärlicherweise) genau dieses Ergebnis:Geben Sie Geld aus dem Quotienten zweier Geldwerte ein. Das ist falsch, aber wie Sie aus dem Beispiel unten sehen, ist es das, was Sie bekommen, obwohl es keinen Sinn ergibt:

declare @m1 money, @m2 money;
declare @d1 decimal(19,4), @d2 decimal(19,4);
set @m1 = 1.00;
set @m2 = 345.00;
set @d1 = 1.00;
set @d2 = 345.00;
select @m1/@m2, @d1/@d2

Ergebnis:0,0028 0,0028985507246376811

Das Ergebnis mit dem Typ Geld, 0,0028, ist 3-4 % kleiner als das korrekte Ergebnis.

Natürlich gibt es viele Situationen, in denen Sie Währungswerte dividieren müssen. Die Gefahr bei der Verwendung des Geldtyps besteht darin, dass der Quotient der falsche Typ ist (und eine Antwort nicht nahe genug an der richtigen liegt). Beispiele für Fragen, die eine Teilung der Währung erfordern:

Angenommen, Sie wechseln 320 Yuan und die Bank gibt Ihnen 47,3 US-Dollar. Welchen Wechselkurs haben Sie erhalten?

Angenommen, Sie investieren 23 US-Dollar und ein Jahr später ist es 31 US-Dollar wert. Wie hoch ist Ihre prozentuale Rendite?

Beide Berechnungen erfordern die Division von Währungswerten.