web-dev-qa-db-fra.com

SQL Server 2008: comment formater la sortie en tant que devise

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.

12
Bevan

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.

15
Solomon Rutzky

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
6
Microtechie