SQL Server 2008:如何将输出格式化为货币

时间:2014-09-29 01:53:55

标签: sql-server tsql casting localization formatting

我有一个查询字符串,它返回一个有几个小数位的值。我想将其格式化为123.45美元。

以下是查询:

SELECT COALESCE(SUM(SUBTOTAL),0) 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6)

我希望结果采用2位小数的货币。

2 个答案:

答案 0 :(得分:15)

如果您正在寻找“真正的”货币格式,类似于通过SQL Server 2012中启动的FORMAT函数可以实现的格式,那么您可以通过SQLCLR实现完全相同的功能。你可以自己编写简单的.ToString("C" [, optional culture info])代码,也可以下载SQL#库(我写的,但这个函数是免费版),并像T-SQL一样使用它{{1功能。

例如:

FORMAT

输出:

  

$ 123.46

SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'en-us');

输出:

  

123,46€

此方法适用于SQL Server 2005/2008/2008 R2。并且,如果/当您升级到较新版本的SQL Server时,您可以选择通过仅将名称SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'fr-fr'); 更改为{{1}来轻松切换到本机T-SQL功能}。

将此问题放入原始问题的查询上下文中:

SQL#.Math_FormatDecimal

修改

OR,因为似乎只需要FORMAT格式,所以有一个简单的快捷方式:使用{转换SELECT SQL#.Math_FormatDecimal(COALESCE(SUM(SUBTOTAL),0), N'C', N'en-us') AS [Total] FROM dbo.SALESORD_HDR where ORDERDATE = datediff(d,0,getdate()) and STATUS NOT IN (3,6) en-us数据类型{3}}函数有MONEY的“样式”减去货币符号,但这很容易添加:

SMALLMONEY

由于en-us字段的源数据类型为SELECT '$' + CONVERT(VARCHAR(50), CONVERT(MONEY, COALESCE(SUM(SUBTOTAL), 0)), 1) AS [Total] FROM dbo.SALESORD_HDR where ORDERDATE = datediff(d,0,getdate()) and STATUS NOT IN (3,6) ,因此首先需要将其转换为SUBTOTAL,然后转换为FLOAT。但是,可选的“样式”是我更喜欢MONEY而不是VARCHAR的一个原因。

答案 1 :(得分:3)

这是用于将来验证搜索查询的语法的建议。

select format(123.56789,'C2','en-US')  --$123.57 ;
select format(123.56789,'C3','en-US') --$123.568;
select format(123.56789,'C0','en-US') --$124