1

我有一个数字:12345.678

我希望它像:(12,345删除其余部分!)

添加千位分隔符的一种解决方案是:

 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

在 SQL Server 2008 中没有简单的方法来做到这一点。SQL Server 2012 引入了FORMAT函数,它使您能够执行以下操作:

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

(尽管这会将数字四舍五入为 12,346)

格式化结果通常不在数据库范围内 - 它应该留给您的前端程序/网站/报告/电子表格等。但是,如果您确实需要在 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','')

这仍然可能存在错误,我再次建议不要在 SQL Server 上执行此操作,除非您正在生成类似 COBOL 的文本报告。

于 2012-11-13T09:18:23.130 回答