我有一个查询字符串,它返回一个有几个小数位的值。我想将其格式化为 123.45 美元的货币。
这里是查询:
SELECT COALESCE(SUM(SUBTOTAL),0)
FROM dbo.SALESORD_HDR
where ORDERDATE = datediff(d,0,getdate())
and STATUS NOT IN (3,6)
我希望结果为小数点后 2 位的货币。
最佳答案
如果您正在寻找“真正的”货币格式,类似于可以通过 SQL Server 2012 中启动的 FORMAT 函数实现的功能,那么您可以通过 SQLCLR 实现完全相同的功能。您可以自己编写简单的 .ToString("C" [, optional culture info])
,也可以下载 SQL# 库(我编写的,但此函数是免费版)并像 T-SQL FORMAT
函数一样使用它。
例如:
SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'en-us');
输出:
$123.46
SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'fr-fr');
输出:
123,46 €
此方法适用于 SQL Server 2005/2008/2008 R2。而且,如果/当您升级到较新版本的 SQL Server 时,您可以选择轻松切换到 native T-SQL 函数,只需将名称 SQL#.Math_FormatDecimal
更改为 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
格式,所以有一个太简单的捷径:使用 CONVERT 函数从 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
。但是,可选的“样式”是我更喜欢 CONVERT
而不是 CAST
的原因之一。
关于sql-server - SQL Server 2008 : how to format the output as a currency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091515/