sql-server - SQL Server 2008 : how to format the output as a currency

标签 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 位的货币。

最佳答案

如果您正在寻找“真正的”货币格式,类似于可以通过 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 函数从 MONEYSMALLMONEY 数据类型转换具有 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/

相关文章:

swift - 将 UnsafeMutablePointer 转换为 [String :AnyObject]

.net - 在 VB.NET 中将 bool 值转换为字节

sql-server - 已安装 VS2012 - 现在无法使用 SSMS 连接到 SQL 服务器

sql-server - 如何从 SQL Server TRY.....CATCH block 获取 error_message

mysql - 我无法在 SQL Server 中创建到 MySQL 的链接服务器

sql-server - 检索在sp_executesql期间打印的消息

sql - 在 SQL Server VARCHAR 列中插入尾随空格

c++ - 为什么在存在隐式转换时赋值速度变慢?

sql-server - ODBC、OLEDB 和 ADO.NET 的底层协议(protocol)有区别吗

c# - C#中使用SQL连接将数据添加到表中