web-dev-qa-db-ja.com

SQLサーバーでお金のデータ型から変換するにはどうすればよいですか?

SQL Serverにmoneyデータ型があります。クエリで0.00を0に再フォーマットするにはどうすればよいですか?

20
senthil

通常のお金の変換は、個々のペニーを保持します:

SELECT convert(varchar(30), moneyfield, 1)

最後のパラメーターは、出力形式の外観を決定します。

0(デフォルト)小数点の左側3桁ごと、および小数点の右側2桁ごとにコンマなし。たとえば、4235.98。

1小数点の左側の3桁ごと、および小数点の右側の2桁ごとにコンマ。たとえば、3,510.92。

2小数点の左側に3桁ごと、および小数点の右側に4桁ごとにコンマはありません。たとえば、4235.9819。

ペニーを切り捨ててポンド単位でカウントする場合は、最も近いポンドへの丸め、床から最も低い整数への丸め、または天井を使用してポンドを切り上げることができます。

SELECT convert(int, round(moneyfield, 0))
SELECT convert(int, floor(moneyfield))
SELECT convert(int, ceiling(moneyfield))
30
Jonathan

Intにキャストすると役に立ちますか?お金は小数点以下の桁を持つことを意図しています...

DECLARE @test AS money
SET @test = 3
SELECT CAST(@test AS int), @test
3
Tina Orooji

まず、moneyデータ型を使用しないでください。計算を行うと、切り捨てられた結果が得られます。以下を実行して、意味を確認してください

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

質問に答えるために(少しあいまいでした)、moneyデータ型は常に小数点以下2桁です。小数部分が必要ない場合や整数に変換したくない場合は、整数データ型を使用します。

おそらく、decimalまたはnumericデータ型を使用したいですか?

3
SQLMenace

私はこれを見つけました approach 直接的で便利です。

CONVERT(VARCHAR(10)、CONVERT(MONEY、fieldname))AS PRICE

1
liang

Moneyデータ型の本質的な制限にもかかわらず、それを既に使用している(または私が持っているように継承している)場合、質問に対する答えはDECIMALを使用することです。

0
Stuart Helwig

あなたはこのように試すことができます:

SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)
0
gdfgdgfdfg

これはフォーマットの問題のようです。
SQL Serverのマネータイプに関する限り、0 == 0.00

たとえばc#で0.00ではなく0を表示しようとしている場合は、文字列に変換し、必要に応じてフォーマットする必要があります。 (または切り捨てます。)

0
Bravax

私もこの問題を抱えており、しばらくの間つまずいた。 0.00を0として表示し、それ以外の場合は小数点を維持したかった。以下は機能しませんでした:

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), Amount, 1) ELSE Amount END

結果の列は強制的にMONEY列になったためです。それを解決するために、以下が働いた

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), '0', 1) ELSE CONVERT (VARCHAR(30), Amount, 1) END

これは、最終宛先列がVARCHAR(30)であり、量が「0」ではなく「0.00」の場合、その列のコンシューマーがエラーになるため、問題でした。

0
Dan Field