我有一个查询字符串,它返回一个有几个小数位的值。我想将其格式化为123.45美元。
以下是查询:
SELECT COALESCE(SUM(SUBTOTAL),0)
FROM dbo.SALESORD_HDR
where ORDERDATE = datediff(d,0,getdate())
and STATUS NOT IN (3,6)
我希望结果采用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