Bueno, me gusta MONEY
! Es un byte más barato que DECIMAL
, y los cálculos se realizan más rápido porque (debajo de las cubiertas) las operaciones de suma y resta son esencialmente operaciones enteras. El ejemplo de @ SQLMenace, que es una gran advertencia para los que no lo saben, podría aplicarse igualmente a los INT
egers, donde el resultado sería cero. Pero esa no es razón para no usar números enteros, cuando corresponda .
Por lo tanto, es perfectamente 'seguro' y apropiado usarlo MONEY
cuando se trata de MONEY
eso y usarlo de acuerdo con las reglas matemáticas que sigue (igual que INT
eger).
¿Hubiera sido mejor si SQL Server promoviera la división y la multiplicación de MONEY
's en DECIMAL
s (o FLOAT
s)? Posiblemente, pero no eligieron hacer esto; ni eligieron promover INT
egers a FLOAT
s al dividirlos.
MONEY
no tiene problemas de precisión; eso DECIMAL
de tener un tipo intermedio más grande usado durante los cálculos es solo una 'característica' de usar ese tipo (y en realidad no estoy seguro de hasta qué punto se extiende esa 'característica').
Para responder a la pregunta específica, ¿una "razón convincente"? Bueno, si desea un rendimiento máximo absoluto en un lugar SUM(x)
donde x
podría ser DECIMAL
o MONEY
, entonces MONEY
tendrá una ventaja.
Además, no olvide que es un primo más pequeño, de solo SMALLMONEY
4 bytes, pero tiene un máximo de 214,748.3647
, que es bastante pequeño para el dinero, y por lo tanto no suele ser una buena opción.
Para probar el punto usando tipos intermedios más grandes, si asigna el intermedio explícitamente a una variable, DECIMAL
sufre el mismo problema:
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
Produce 2950.0000
(bueno, al menos DECIMAL
redondeado en lugar de MONEY
truncado, igual que un entero).
DECIMAL(19, 4)
es una opción popular, verifique esto también marque aquí Formatos de moneda mundial para decidir cuántos lugares decimales usar, la esperanza ayuda.