1. ホーム
  2. sql-server

[解決済み] SQL Serverでは、MONEYとDECIMAL(x,y)のどちらをデータ型として選択すべきでしょうか?

2022-03-19 19:57:20

質問

の違いは本当にあるのでしょうか? money のようなデータ型と decimal(19,4) (moneyが内部で使っているものだと思います)。

私が認識しているのは money はSQL Serverに特化したものです。どちらを選ぶか、やむを得ない理由があるかどうかを知りたいのです。ほとんどのSQL Serverサンプル(AdventureWorksデータベースなど)は、SQL Serverを使用しています。 money であり decimal は、価格情報などのために使用されます。

このままmoneyデータ型を使い続けるべきなのか、それとも10進数で代用するメリットがあるのでしょうか?お金の方が入力する文字数が少なくて済みますが、それは正当な理由ではありません :)

どのように解決するのですか?

お金は絶対に使ってはいけません。常に10進数や数値を使ってください。

これを実行すると、私が言いたいことがわかります。

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

出力されます。2949.0000 2949.8525

お金をお金で割らないという人がいましたが、その人へ。

これは相関関係を計算するための私のクエリの1つですが、これをお金に変えると間違った結果が得られます。

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