¿Debería elegir los tipos de datos MONEY o DECIMAL(x,y) en SQL Server?

Resuelto Wayne Molina asked hace 15 años • 13 respuestas

Tengo curiosidad por saber si existe o no una diferencia real entre el moneytipo de datos y algo así decimal(19,4)(que es lo que el dinero usa internamente, creo).

Soy consciente de que moneyes 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 moneyy no decimalpara 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 :)

Wayne Molina avatar Feb 25 '09 00:02 Wayne Molina
Aceptado

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 avatar Feb 24 '2009 17:02 SQLMenace

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

moneyes 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 decimals.

configurator avatar Feb 24 '2009 18:02 configurator