Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Que tipo de dados devo usar para armazenar valores monetários?


Papuccino,

Não recomendo os tipos money e smallmoney, a menos que você tenha certeza de que a única aritmética que planeja fazer é adição e subtração. Se você estiver lidando com taxas de câmbio, porcentagens e assim por diante, corre o risco de ter problemas reais com esses tipos.

Aqui está apenas um pequeno exemplo para mostrar a diferença entre usar dinheiro, decimal e float quando a divisão está envolvida. É possível apresentar exemplos em que a diferença é muito mais dramática.
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;

Resultado:0,0028 0,0029 0,00289855072463768

Dependendo do setor, pode haver diretrizes ou regulamentos para ajudá-lo a decidir sobre o tipo de dados correto. Não há uma resposta certa.

Observações adicionadas:

Você está certo de que dinheiro/dinheiro não deve ser dinheiro, mas o SQL Server (inexplicavelmente) produz exatamente esse resultado:digite dinheiro a partir do quociente de dois valores monetários. Isso é falso, mas como você vê no exemplo abaixo, é o que você obtém, mesmo que não faça sentido:
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

Resultado:0,0028 0,0028985507246376811

O resultado com tipo dinheiro, 0,0028, é 3-4% menor que o resultado correto.

Claro, existem muitas situações em que você precisa dividir valores de moeda. O perigo de usar o tipo dinheiro é que o quociente é do tipo errado (e uma resposta não próxima o suficiente da correta). Exemplos de perguntas que exigem divisão de moeda:

Suponha que você troque 320 Yuan e o banco lhe dê 47,3 dólares americanos. Qual é a taxa de câmbio que você recebeu?

Suponha que você invista $ 23 e um ano depois valha $ 31. Qual é a sua taxa percentual de retorno?

Ambos os cálculos exigem a divisão de valores de moeda.