2012-11-03 1 views
8

私はT-SQLで次のようにコンマでフォーマットされた番号を作成しています。小数点以下を切り捨てるにはどうすればいいですか?フォーマット後に1,112.00が得られたら、どうすれば1,112を得ることができますか?数値はコンマで区切りますが、SQL Server 2008 R2では小数点以下は含まれません。

SELECT CONVERT(varchar, CAST(1112 AS money), 1) 
+0

回答を2つマークするにはどうすればよいですか?私は詳細な答えを加え、Mitchの投稿も答えです。 – Sunil

+2

SQL Server 2012以降+ FORMAT()関数を使用できます。 2番目のパラメータとして '#、##'を使用します。 http://msdn.microsoft.com/en-us/library/hh213505.aspx – Volvox

+0

[T-SQLでカンマで数字をフォーマットするにはどうすればいいですか?](https://stackoverflow.com/questions/4377352)/how-do-i-format-a-number-comm-in-t-sql) –

答えて

17
DECLARE @val varchar(50) 

set @val = CONVERT(varchar(50), CAST(1112 AS money), 1) 
SELECT left(@val, len(@val) - 3) 

また、これは、小数点以下の桁で動作:

DECLARE @val varchar(50) 

set @val = CONVERT(varchar(50), CAST(1112.56 AS money), 1) 
SELECT left(@val, len(@val) - 3) 

:@Mahmoudガマルが指摘するように、フォーマットは、多くの場合、フロントで行うことがより適しています終わり。

16

ので、同じように:

SELECT REPLACE(CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1), '.00', ''); 

これは、常に正常に動作します。 CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1)は常に.00の数値を返します。ただし、コンマの後に10進数の数字がある場合は、MitchWheat's answerが適しています。

:フロントエンドアプリケーションでこの書式設定を行うことを検討する必要があります。 T-SQLは書式設定に関するものではありません。

+0

Mahmoud - ありがとうございました。 1112.34の場合、.00を切り捨てるとうまくいかないでしょう。私は一般的な解決策を探していました。 – Sunil

+0

@Sunil - はい、そうです。これは1112.34の場合には機能しません。しかし、あなたの質問であなたが言及したケースの場合、それは常にうまく動作します。 'CONVERT(VARCHAR(20)、CAST(1112 AS MONEY)、1);'は常に '.00'で数字を返します。どのような方法でも、@ MitchWheatの答えはこれよりも優れており、この場合はうまく動作します。 –

+0

+1フロントエンドアプリケーションの書式に関するポイント。 –

1

調査の結果、最初の質問に2つの可能な回答が見つかりました。それらは以下の通りです。

オプション1:Mitch Wheatの回答が可能です。しかし、SELECT内で列の値を書式化する場合は、MitchのT-SQLコードを使用してユーザー定義のスカラー関数を作成し、SQLからこのUDFを呼び出す必要があります。

-- ============================================= 
-- Description: Formats a number and truncates 
--    the decimal part. You can pass 
--    a number as a string or a numeric type. 
-- ============================================= 
CREATE FUNCTION dbo.Utility_fn_FormatNumberAndTruncateDecimals 
(
    @unFormattedNumber VARCHAR(100) 
) 
RETURNS VARCHAR(100) 
    AS 
BEGIN 
    DECLARE @val VARCHAR(100) 
    SET @val = convert(VARCHAR(50), cast(@unFormattedNumber AS MONEY), 1) 

    RETURN (SELECT left(@val, len(@val) - 3)) 
END 
GO 

--call this function using either of the SELECTS below 
SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals('233444') 
SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals(233444.345) 

オプション2:我々は、フォーマットし、小数点以下を切り捨てるために、以下のT-SQLコードのように「parsename」と呼ばれる組み込みシステムの機能を使用することができます。

SELECT PARSENAME(CONVERT(VARCHAR, CAST('2334442221.345222' AS MONEY), 1),2) 
+0

"ただし、SELECT内で列の値を書式設定する場合は、" - 間違っています。私はその意図を明確にするようにそのようにしました。私はちょうどそれを簡単にインラインで行うことができたかもしれません。 –

+0

ミッチ - そうです。どういうわけか、私はその事実を見落としました。私はちょうどあなたのロジックをインラインで使うことができました。あなたの答えを感謝します。 – Sunil

9
PARSENAME(CONVERT(VARCHAR,CAST(1112 AS MONEY),1),2) 

それはうまく動作します。

数字を貨幣データ型に自動的に変換する場合、小数点以下2桁目が自動的に追加されます。 PARSENAME関数はそのゼロを削除します。

+0

どのように間違っていますか? – Govind

+0

コメントを削除しました。将来、OPの実際の変数名や値を使用し、コードブロックをポストするのではなく、何が起こっているのかの説明も含めると便利です。これらが見つからなかったので、このコードは質問とは無関係であると思われましたが、私はその前提で間違っていました。 –

+0

良い提案.. – Govind

関連する問題