1

私は次のような番号を持っています:12345.678

私はそれが次のようになりたい:(12,345残りを削除する!)

桁区切り記号を追加する1つの解決策は次のとおりです。

 select convert(varchar(100), cast(12345.678 as money), 1)

が得られます:12,345.68

今、私は削除する必要があります.68

parseNameを使用した美しいソリューションに 出くわしました :

 select    parsename(convert(varchar(100), cast(12345.678 as money), 1),2)

が得られます:12,345

質問:この問題に対するより良い解決策はありますか? (おそらく、他の関数/文字列操作を伴わずに?)

4

4 に答える 4

5

There's no easy way of do this in SQL server 2008. SQL Server 2012 ではFORMAT関数が導入され、次のことが可能になります。

SELECT FORMAT(12345.67, '#,###')

(ただし、これにより数値が 12,346 に丸められます)

結果の書式設定は、通常、データベースの範囲内にないものです。これは、フロントエンド プログラム/Web サイト/レポート/スプレッドシートなどに任せるべきものです。ただし、SQL Server でこれを本当に行う必要がある場合は、 CLR 統合を使用して .NET から String.Format 関数にリンクしない限り、あなたのソリューションはあなたが得ようとしているのと同じくらい近いと思います。

parseName を使用してソリューションを使用する場合は、国際的に機能しない可能性があることに注意してください (たとえば、,が小数点記号として使用されているヨーロッパの一部)。これは問題にならないかもしれませんが、問題がある場合は、フォーマットを明示的に制御できるソリューションが必要になります。

于 2012-11-13T08:39:26.297 に答える
3

Parsename は確かに独創的なソリューションです。私はいつも使用しています

select replace(convert(varchar,cast(floor(12345.678) as money),1), '.00', '');
--     parsename(convert(varchar,cast(12345.678 as money),1), 2);

もっと長いですが。しかし、おそらく直接置換は解析ルーチンよりも高速ですか? いずれにせよ、たとえ 21ns 速く実行されたとしても、より大きなスキームでは、そのような質問で何を改善しようとしているのかという意味では良くありません。

于 2012-11-13T08:49:34.373 に答える
2

floor() を使用して、最初に整数に変換します。

select convert(varchar(100), cast(floor(12345.68) as money), 1)
于 2012-11-13T08:10:40.370 に答える
0

これは通常「プレゼンテーション」層で行われるというリチャーズのコメントを支持します。SQL Server でこれをフォーマットする必要があるのはなぜですか? レポートを SQL Server で直接表示していますか? 通常、誰かが最初に行うことは、コピーして Excel に貼り付けることです。

とにかく、上記の式をさらにいくつかの文字列関数でいつでもラップできる場合:

select replace(
convert(
    varchar(100), 
    cast(floor(12345.68) as money),
    1
),'.00','')

これにはまだバグの可能性があります。また、COBOL のようなテキスト レポートを生成する場合を除き、SQL Server でこれを行うことはお勧めしません。

于 2012-11-13T09:18:23.130 に答える