¿Debería elegir los tipos de datos MONEY o DECIMAL(x,y) en SQL Server?
Tengo curiosidad por saber si existe o no una diferencia real entre el money
tipo de datos y algo así decimal(19,4)
(que es lo que el dinero usa internamente, creo).
Soy consciente de que money
es específico de SQL Server. Quiero saber si existe una razón de peso para elegir uno sobre el otro; la mayoría de los ejemplos de SQL Server (por ejemplo, la base de datos AdventureWorks) se utilizan money
y no decimal
para cosas como información de precios.
¿Debo seguir usando el tipo de datos dinero o hay algún beneficio en usar decimales? El dinero requiere menos caracteres para escribir, pero esa no es una razón válida :)
Nunca jamás deberías usar dinero. No es preciso y es pura basura; Utilice siempre decimal/numérico.
Ejecute esto para ver a qué me refiero:
DECLARE
@mon1 MONEY,
@mon2 MONEY,
@mon3 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)
SELECT
@mon1 = 100, @mon2 = 339, @mon3 = 10000,
@num1 = 100, @num2 = 339, @num3 = 10000
SET @mon4 = @mon1/@mon2*@mon3
SET @num4 = @num1/@num2*@num3
SELECT @mon4 AS moneyresult,
@num4 AS numericresult
Salida: 2949.0000 2949.8525
A algunas de las personas que dijeron que no se divide dinero por dinero:
Esta es una de mis consultas para calcular correlaciones y cambiarla a dinero produce resultados incorrectos.
select t1.index_id,t2.index_id,(avg(t1.monret*t2.monret)
-(avg(t1.monret) * avg(t2.monret)))
/((sqrt(avg(square(t1.monret)) - square(avg(t1.monret))))
*(sqrt(avg(square(t2.monret)) - square(avg(t2.monret))))),
current_timestamp,@MaxDate
from Table1 t1 join Table1 t2 on t1.Date = traDate
group by t1.index_id,t2.index_id
SQLMenace dijo que el dinero es inexacto. ¡Pero no multiplicas ni divides dinero por dinero! ¿Cuánto es 3 dólares por 50 centavos? ¿150 centavos de dólar? Multiplicas/divides el dinero por escalares, que deberían ser decimales.
DECLARE
@mon1 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)
SELECT
@mon1 = 100,
@num1 = 100, @num2 = 339, @num3 = 10000
SET @mon4 = @mon1/@num2*@num3
SET @num4 = @num1/@num2*@num3
SELECT @mon4 AS moneyresult,
@num4 AS numericresult
Da como resultado el resultado correcto:
resultado de dinero resultado numérico --------------------- ----------------------- ---------- 2949.8525 2949.8525
money
es bueno siempre y cuando no necesites más de 4 dígitos decimales y te asegures de que tus escalares, que no representan dinero, sean decimal
s.