从Number中删除小数,在Sql server中保留数千个分隔符?

时间:2012-11-13 08:02:08

标签: sql-server sql-server-2008

我有一个数字: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 个答案:

答案 0 :(得分:5)

在SQL Server 2008中没有简单的方法.SQL Server 2012引入了FORMAT函数,使您可以执行以下操作:

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

(虽然这会将数字四舍五入到12,346)

格式化结果通常不属于数据库范围 - 这应该留给您的前端程序/网站/报告/电子表格等。但是,如果您确实需要在SQL Server,我怀疑你的解决方案尽可能接近,除非你使用CLR Integration从.NET链接到String.Format函数。

如果您使用parseName确实使用了您的解决方案,请注意它可能无法在国际范围内使用(例如,在使用,作为小数分隔符的欧洲部分地区)。这对您来说可能不是问题,但如果是,那么您将需要一个允许您明确控制格式的解决方案。

答案 1 :(得分:3)

Parsename确实是一个创造性的解决方案。我一直在使用

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

虽然时间更长。但也许直接替换比解析例程更快?在任何情况下,从某种意义上来说,即使它运行速度提高了21秒,在更大的方案中,你还试图通过这样的问题来改进它,这并不是更好吗?

答案 2 :(得分:2)

使用floor()将其转换为整数:

select convert(varchar(100), cast(floor(12345.68) as money), 1)

答案 3 :(得分:0)

我支持理查兹评论说这通常是在'演示'层中完成的。为什么需要在SQL Server中格式化?您是否直接在SQL Server中查看报告?通常,有人做的第一件事就是复制并粘贴到Excel中。

无论如何你总是可以将上面的表达式包装成更多的字符串函数:

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

此处仍然存在可能的错误,我不建议在SQL Server上完成此操作,除非您生成类似COBOL的文本报告。