sql >> Base de Datos >  >> RDS >> Sqlserver

¿Qué tipo de datos debo usar para almacenar valores monetarios?

Papuccino,

No recomiendo los tipos money y smallmoney a menos que esté seguro de que la única aritmética que planea hacer es la suma y la resta. Si puede estar tratando con tipos de cambio, porcentajes, etc., corre el riesgo de tener problemas reales con estos tipos.

Aquí hay solo un pequeño ejemplo para mostrarle la diferencia entre usar dinero, decimal y flotante cuando se trata de división. Es posible encontrar ejemplos en los que la diferencia sea mucho más 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

Dependiendo de la industria, puede haber pautas o regulaciones para ayudarlo a decidir sobre el tipo de datos correcto. No hay una respuesta correcta.

Observaciones añadidas:

Tiene razón en que dinero/dinero no debería ser dinero, pero SQL Server (inexplicablemente) produce exactamente ese resultado:escriba dinero a partir del cociente de dos valores de dinero. Esto es falso, pero como puede ver en el siguiente ejemplo, es lo que obtiene, aunque no tiene 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

El resultado con tipo dinero, 0,0028, es un 3-4 % inferior al resultado correcto.

Por supuesto, hay muchas situaciones en las que necesita dividir los valores de las monedas. El peligro de usar el tipo de dinero es que el cociente es del tipo incorrecto (y una respuesta que no se acerca lo suficiente a la correcta). Ejemplos de preguntas que requieren dividir moneda:

Supongamos que cambias 320 yuanes y el banco te da 47,3 dólares estadounidenses. ¿Cuál es el tipo de cambio que te han dado?

Suponga que invierte $23 y un año después vale $31. ¿Cuál es su tasa de rendimiento porcentual?

Ambos cálculos requieren dividir los valores de las monedas.