我有一個查詢字符串,它返回一個有小數位的值。我想將其格式設置爲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