我有一个查询字符串,它返回一个有小数位的值。我想将其格式设置为123.45美元。SQL Server 2008:如何将输出格式化为货币
下面是该查询:
SELECT COALESCE(SUM(SUBTOTAL),0)
FROM dbo.SALESORD_HDR
where ORDERDATE = datediff(d,0,getdate())
and STATUS NOT IN (3,6)
我想要的结果在货币与2位小数。
我有一个查询字符串,它返回一个有小数位的值。我想将其格式设置为123.45美元。SQL Server 2008:如何将输出格式化为货币
下面是该查询:
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时,您可以选择仅通过将名称SQL#.Math_FormatDecimal
更改为FORMAT
来轻松切换到本机T-SQL功能。
把这个进入查询从原来的问题的背景:
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)
编辑:
OR,因为似乎只有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
。但是,可选的“风格”是我比CAST
更喜欢CONVERT
的原因之一。
好吧,那么如何编写它以适应我的代码呢?如果我把我的查询放在123.456的固定值的位置,它会失败,并说不能在里面嵌套查询。 – Bevan 2014-09-29 02:15:19
@Bevan:它只是一个像COALESCE,SUM等函数。我将更新我的答案,以便在查询的上下文中使用它。 – 2014-09-29 02:19:20
@Bevan:答案已更新为实际使用情况。 – 2014-09-29 02:23:49
你的意思是一个“真正的”货币,一个可以处理各种文化格式的货币?类似于在SQL Server 2012中启动的FORMAT函数(http://msdn.microsoft.com/zh-cn/library/hh213505.aspx)? – 2014-09-29 02:02:00
不,只是一种文化(en-us)为新西兰元$#,###。00 – Bevan 2014-09-29 02:12:47
好的。我仍然添加了一个答案,以说明完整的格式(即货币符号,符号位置,千位分隔符和小数点)。但要清楚,你需要千位分隔符(正如你的评论中所示),对吧? – 2014-09-29 02:18:15