我有一个数字,如:12345.678
我希望它像:12,345
(删除其余的!
添加千位分隔符的一种解决方案是:
select convert(varchar(100), cast(12345.678 as money), 1)
产生 : 12,345.68
现在我应该删除.68
我偶然发现了一个带有解析名称的漂亮解决方案:
select parsename(convert(varchar(100), cast(12345.678 as money), 1),2)
产生 : 12,345
问题:这个问题有更好的解决方案吗?(也许不涉及其他函数/字符串操作?
在SQL Server 2008中没有简单的方法可以做到这一点。 SQL Server 2012 引入了 FORMAT 函数,它使您能够执行以下操作:
SELECT FORMAT(12345.67, '#,###')
(尽管这会将数字四舍五入为 12,346)
格式化结果通常不在数据库范围内 - 它应该留给你的前端程序/网站/报告/电子表格等。 但是,如果您确实需要在SQL Server中执行此操作,我怀疑您的解决方案与您将要获得的解决方案一样接近,除非您使用CLR集成从.NET链接到String.Format函数。
如果您确实使用 parseName 使用您的解决方案,请注意它可能不适用于国际(例如,在欧洲部分地区使用 ,
作为小数分隔符)。 这对您来说可能不是问题,但如果是,那么您需要一个允许您明确控制格式的解决方案。
Parsename确实是一个创造性的解决方案。 我一直在使用
select replace(convert(varchar,cast(floor(12345.678) as money),1), '.00', '');
-- parsename(convert(varchar,cast(12345.678 as money),1), 2);
虽然它更长。但也许直接替换比解析例程更快?无论如何,从某种意义上说,即使它运行速度快了 21ns,在更大的计划中,你想用这样的问题改进什么?
首先使用 floor() 将其转换为整数:
select convert(varchar(100), cast(floor(12345.68) as money), 1)
我支持理查兹的评论,即这通常是在"演示"层完成的。为什么需要在 SQL Server 中设置此格式?您是否直接在 SQL Server 中查看报表?通常,某人要做的第一件事就是复制并粘贴到Excel中。
无论如何,如果您总是可以将上面的表达式包装在更多字符串函数中:
select replace(
convert(
varchar(100),
cast(floor(12345.68) as money),
1
),'.00','')
这仍然可能存在错误,同样,我不建议在SQL Server上执行此操作,除非您正在生成类似COBOL的文本报告。