J'ai une chaîne de requête qui renvoie une valeur qui a plusieurs décimales. Je veux formater cela dans une devise de 123,45 $.
Voici la requête:
SELECT COALESCE(SUM(SUBTOTAL),0)
FROM dbo.SALESORD_HDR
where ORDERDATE = datediff(d,0,getdate())
and STATUS NOT IN (3,6)
Je veux le résultat dans une devise avec 2 décimales.
Si vous recherchez un "vrai" format monétaire, similaire à ce qui peut être obtenu via la fonction FORMAT qui a démarré dans SQL Server 2012, vous pouvez la même fonctionnalité exacte via SQLCLR. Vous pouvez soit coder vous-même la simple .ToString("C" [, optional culture info])
, soit télécharger la bibliothèque SQL # (que j'ai écrite, mais cette fonction est dans la version gratuite) et l'utiliser comme le Fonction T-SQL FORMAT
.
Par exemple:
SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'en-us');
Production:
123,46 $
SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'fr-fr');
Production:
123,46 €
Cette approche fonctionne dans SQL Server 2005/2008/2008 R2. Et, si/lorsque vous effectuez une mise à niveau vers une version plus récente de SQL Server, vous avez la possibilité de passer facilement à la fonction T-SQL native en ne faisant rien de plus que de changer le nom SQL#.Math_FormatDecimal
pour être juste FORMAT
.
Mettre cela dans le contexte de la requête de la question d'origine:
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)
MODIFIER:
OU, car il semble que seul en-us
le format est souhaité, il y a un raccourci qui est tout simplement trop facile: Conversion à partir des types de données MONEY
ou SMALLMONEY
en utilisant les CONVERT la fonction a un "style" pour en-us
moins le symbole monétaire, mais c'est assez facile à ajouter:
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)
Le type de données source du champ SUBTOTAL
étant FLOAT
, il doit d'abord être converti en MONEY
puis converti en VARCHAR
. Mais, le "style" optionnel est une des raisons pour lesquelles je préfère CONVERT
plutôt que CAST
.
Voici une suggestion de la syntaxe à utiliser pour pérenniser la requête de recherche.
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