Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jakiego typu danych należy używać do przechowywania wartości pieniężnych?

Papuccino,

Nie polecam typów money i smallmoney, chyba że jesteś pewien, że jedyną arytmetyką, którą planujesz zrobić, jest dodawanie i odejmowanie. Jeśli masz do czynienia z kursami wymiany, wartościami procentowymi itd., ryzykujesz prawdziwe problemy z tymi typami.

Oto tylko jeden mały przykład, który pokazuje różnicę między używaniem pieniędzy, liczb dziesiętnych i zmiennoprzecinkowych, gdy w grę wchodzi dzielenie. Możliwe jest wymyślenie przykładów, w których różnica jest znacznie bardziej dramatyczna.

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;

Wynik:0,0028 0,0029 0,00289855072463768

W zależności od branży mogą istnieć wytyczne lub przepisy, które pomogą Ci wybrać odpowiedni typ danych. Nie ma jednej właściwej odpowiedzi.

Dodane uwagi:

Masz rację, że pieniądze/pieniądze nie powinny być pieniędzmi, ale SQL Server (w niewytłumaczalny sposób) daje dokładnie taki wynik:wpisz pieniądze z ilorazu dwóch wartości pieniężnych. To jest fałszywe, ale jak widać z poniższego przykładu, otrzymujesz to, nawet jeśli nie ma to sensu:

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

Wynik:0,0028 0,0028985507246376811

Wynik z typem pieniędzy, 0,0028, jest o 3-4% niższy niż poprawny wynik.

Oczywiście istnieje wiele sytuacji, w których trzeba podzielić wartości walutowe. Niebezpieczeństwo używania typu pieniędzy polega na tym, że iloraz jest niewłaściwy (i odpowiedź nie jest wystarczająco zbliżona do właściwej). Przykłady pytań wymagających dzielenia waluty:

Załóżmy, że wymieniasz 320 juanów, a bank daje ci 47,3 dolarów amerykańskich. Jaki jest kurs wymiany, który otrzymałeś?

Załóżmy, że inwestujesz 23 USD, a rok później jest to warte 31 USD. Jaka jest Twoja procentowa stopa zwrotu?

Oba te obliczenia wymagają podzielenia wartości walut.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instrukcja PRINT w T-SQL

  2. Zapobiegaj wstawianiu nakładających się zakresów dat za pomocą wyzwalacza SQL

  3. Jak naprawić „Serwer nie jest skonfigurowany do dostępu do danych” w SQL Server

  4. Usunąć pojedynczy rekord z Entity Framework?

  5. GUID:varchar(36) kontra uniqueidentifier