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.