Ответ 1
Если вы ищете "истинный" формат валюты, подобный тому, что может быть достигнуто с помощью функции FORMAT, которая была запущена в SQL Server 2012, то вы можете достичь точно такой же функциональности через SQLCLR. Вы можете либо .ToString("C" [, optional culture info])
кодировать простой .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, у вас есть возможность легко переключиться на встроенную функцию 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
формат желателен, есть укороченное это слишком просто: Преобразование либо MONEY
или SMALLMONEY
типов данных с помощью CONVERT функции есть "стиль" для 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
.