Cóż, lubię MONEY
! Jest to bajt tańszy niż DECIMAL
, a obliczenia wykonują się szybciej, ponieważ (pod przykryciem) operacje dodawania i odejmowania są zasadniczo liczbami całkowitymi. @ Przykład SQLMenace - który jest doskonałym ostrzeżeniem dla nieświadomych - może być również zastosowany do INT
eger, gdzie wynik byłby zerowy. Ale to nie jest powód, aby nie używać liczb całkowitych - w stosownych przypadkach .
Jest więc całkowicie „bezpieczny” i odpowiedni do użycia, MONEY
gdy masz do czynienia z tym, z czym masz do czynienia MONEY
i stosuj go zgodnie z matematycznymi zasadami, które on przestrzega (tak samo jak np INT
.
Czy byłoby lepiej, gdyby SQL Server promował dzielenie i mnożenie MONEY
na DECIMAL
s (lub FLOAT
s?) - być może, ale nie zdecydowali się tego zrobić; nie zdecydowali się też promować INT
egerów FLOAT
podczas dzielenia ich.
MONEY
nie ma problemu z precyzją; to, że DECIMAL
podczas obliczeń może zostać użyty większy typ pośredni, jest po prostu „cechą” używania tego typu (i nie jestem pewien, jak daleko sięga ta „cecha”).
Aby odpowiedzieć na konkretne pytanie, „ważny powód”? Cóż, jeśli chcesz bezwzględną wydajność maksymalnie w SUM(x)
którym x
mogłyby być DECIMAL
lub MONEY
, wtedy MONEY
będzie miał przewagę.
Nie zapomnij też, że jest mniejszym kuzynem SMALLMONEY
- tylko 4 bajty, ale osiąga maksimum przy 214,748.3647
- co jest dość małe jak na pieniądze - i dlatego często nie jest dobrze dopasowane.
Aby dowieść sensu przy użyciu większych typów pośrednich, jeśli przypisujesz pośrednio jawnie do zmiennej, DECIMAL
występuje ten sam problem:
declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)
select @a = 100, @b = 339, @c = 10000
set @d = @a/@b
set @d = @d*@c
select @d
Daje 2950.0000
(okej, więc przynajmniej DECIMAL
zaokrąglaj, a nie MONEY
obcinaj - tak samo jak liczba całkowita).
DECIMAL(19, 4)
jest popularnym wyborem sprawdź to również sprawdź tutaj Formaty walut światowych, aby zdecydować, ile miejsc po przecinku użyć, w czym nadzieja pomaga.