it-swarm.com.de

PostgreSQL: Welcher Datentyp sollte für die Währung verwendet werden?

Scheint, als ob vom Typ Money wie beschrieben abgeraten wird hier

In meiner Anwendung muss die Währung gespeichert werden. Welchen Datentyp soll ich verwenden? Zahlen, Geld oder FLOAT?

105
daydreamer

Numerisch mit erzwungener Genauigkeit von 2 Einheiten. Verwenden Sie niemals float oder float like als Datentyp, um die Währung darzustellen, da die Leute sonst unglücklich werden, wenn die unterste Zeile des Finanzberichts um + oder - ein paar Dollar falsch ist.

Soweit ich das beurteilen kann, wird die Geldart nur aus historischen Gründen beibehalten.

75
Chris Farmiloe

Ihre Quelle ist in keiner Weise offiziell. Es stammt aus dem Jahr 2011 und ich erkenne nicht einmal die Autoren. Wenn die Geldart "entmutigt" wäre, würde PostgreSQL dies im Handbuch sagen - , was nicht der Fall ist .

Für eine offiziellere Quelle lesen Sie diesen Thread in pgsql-general (ab dieser Woche!) , mit Aussagen von Core-Entwicklern wie D'Arcy JM Cain (ursprünglicher Autor des Geldtyps) und Tom Lane:

Grundsätzlich hat money eine (eingeschränkte) Verwendung. Der Vorteil gegenüber numeric ist Leistung.

decimal ist nur ein Alias ​​für numeric in Postgres.

Verwandte Antwort (und Kommentare!) Zu Verbesserungen in neueren Versionen:

Persönlich möchte ich Währung als integer speichern, das Cents darstellt. Das ist effizienter als jede andere der genannten Optionen.

94

Ihre Wahlmöglichkeiten sind:

  1. integer: Speichern Sie den Betrag in Cent. Dies ist, was EFTPOS-Transaktionen verwenden.
  2. decimal(12,2): Speichert den Betrag mit genau zwei Dezimalstellen. Dies wird von den meisten Hauptbuchprogrammen verwendet.
  3. float: schreckliche Idee - ungenügende Genauigkeit. Dies ist, was naive Entwickler verwenden.

Option 2 ist am gebräuchlichsten und am einfachsten zu handhaben. Stellen Sie die Genauigkeit (in meinem Beispiel 12, dh insgesamt 12 Stellen) so groß oder klein ein, wie es für Sie am besten funktioniert.

Wenn Sie mehrere Transaktionen, die das Ergebnis einer Berechnung waren (z. B. einen Wechselkurs), zu einem einzigen Wert mit geschäftlicher Bedeutung zusammenfassen, sollte die Genauigkeit höher sein, um einen genauen Makrowert bereitzustellen. Erwägen Sie die Verwendung von decimal(18, 8), damit die Summe genau ist und die einzelnen Werte für die Anzeige auf Cent-Genauigkeit gerundet werden können.

58
Bohemian

Ich behalte alle meine Währungsfelder wie folgt:

numeric(15,6)

Es scheint übertrieben, so viele Dezimalstellen zu haben, aber wenn es nur die geringste Chance gibt, dass Sie mit mehreren Währungen umgehen müssen, müssen Sie so genau konvertieren. Egal, was ich einem Benutzer vorstelle, ich speichere immer in US-Dollar. Auf diese Weise kann ich unter Berücksichtigung des Umrechnungskurses für den betreffenden Tag problemlos in eine andere Währung umrechnen.

Wenn Sie nie etwas anderes als eine Währung machen, ist das Schlimmste, dass Sie ein wenig Platz verschwendet haben, um einige Nullen zu speichern.

20

Verwenden Sie eine 64-Bit-Ganzzahl, die als bigint gespeichert ist.

Ich empfehle die Verwendung von Mikrodollar (oder einer ähnlichen Hauptwährung). Mikro bedeutet 1 Millionstel, also 1 Mikrodollar = 0,000001 USD.

  • Genug Präzision für Bruchteile von einem Cent.
  • Funktioniert gut für sehr geringe Stückpreise (wie Anzeigenimpressionen oder API-Gebühren).
  • Einfach zu bedienen und mit jeder Sprache kompatibel.
  • Kleinere Datengröße für die Speicherung als Zeichenfolgen oder Zahlen.
  • Bequeme Genauigkeit durch Berechnungen und Rundung der endgültigen Ausgabe.
8
Mani Gandham