web-dev-qa-db-fra.com

Comment convertir un type de données money dans un serveur SQL?

J'ai un type de données d'argent dans SQL Server. Comment reformater 0.00 à 0 dans ma requête?

17
senthil

Les conversions normales d'argent préservent des sous en particulier:

SELECT convert(varchar(30), moneyfield, 1)

Le dernier paramètre décide à quoi ressemble le format de sortie:

0 (par défaut) Pas de virgule tous les trois chiffres à gauche du séparateur décimal et deux chiffres à droite du séparateur décimal; par exemple, 4235.98. 

1 virgule tous les trois chiffres à gauche de la virgule et deux chiffres à droite de la virgule; par exemple, 3 510,92. 

2 Pas de virgule tous les trois chiffres à gauche du point décimal et quatre chiffres à droite du point décimal; par exemple, 4235.9819. 

Si vous souhaitez tronquer les sous et compter en livres, vous pouvez arrondir à la livre la plus proche, sol à la livre la plus basse ou plafonner pour arrondir les livres:

SELECT convert(int, round(moneyfield, 0))
SELECT convert(int, floor(moneyfield))
SELECT convert(int, ceiling(moneyfield))
27
Jonathan

Est-ce que le couler pour vous aider? L'argent est censé avoir les décimales ...

DECLARE @test AS money
SET @test = 3
SELECT CAST(@test AS int), @test
3
Tina Orooji

Tout d'abord, vous ne devriez jamais utiliser le type de données money. Si vous effectuez des calculs, vous obtiendrez des résultats tronqués. Exécutez ce qui suit pour voir ce que je veux dire

DECLARE
    @mon1 MONEY,
    @mon2 MONEY,
    @mon3 MONEY,
    @mon4 MONEY,
    @num1 DECIMAL(19,4),
    @num2 DECIMAL(19,4),
    @num3 DECIMAL(19,4),
    @num4 DECIMAL(19,4)

    SELECT
    @mon1 = 100, @mon2 = 339, @mon3 = 10000,
    @num1 = 100, @num2 = 339, @num3 = 10000

    SET @mon4 = @mon1/@mon2*@mon3
    SET @num4 = @num1/@num2*@num3

    SELECT @mon4 AS moneyresult,
    @num4 AS numericresult

Sortie: 2949.0000 2949.8525

Maintenant, pour répondre à votre question (elle était un peu vague), le type de données money a toujours deux places après le point décimal. Utilisez le type de données entier si vous ne voulez pas la partie fractionnaire ou si vous ne convertissez pas en int. 

Peut-être souhaitez-vous utiliser le type de données décimal ou numérique? 

3
SQLMenace

J'ai trouvé cette approche directe et utile.

CONVERT (VARCHAR (10), CONVERT (MONEY, nom du champ)) AS PRICE

1
liang

Il semble que malgré les limitations intrinsèques du type de données money, si vous l'utilisez déjà (ou si vous en avez hérité comme je l'ai), la réponse à votre question est, utilisez DECIMAL.

0
Stuart Helwig

Vous pouvez essayer comme ça:

SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)
0
gdfgdgfdfg

Cela ressemble à un problème de formatage pour moi.
En ce qui concerne le type d’argent de SQL Server, 0 == 0.00

Si vous essayez d'afficher 0 dans say c # plutôt que 0,00, vous devez le convertir en chaîne et le formater à votre guise. (ou le tronquer.)

0
Bravax

J'ai eu ce problème aussi, et j'ai trébuché pendant un moment dessus. Je voulais afficher 0,00 comme 0 et sinon conserver le point décimal. Les éléments suivants n'ont pas fonctionné:

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), Amount, 1) ELSE Amount END

Parce que la colonne résultante a été forcée d'être une colonne d'ARGENT. Pour résoudre ce problème, les éléments suivants ont fonctionné

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), '0', 1) ELSE CONVERT (VARCHAR(30), Amount, 1) END

Cela importait parce que ma colonne de destination finale était un VARCHAR (30) et que les utilisateurs de cette colonne se tromperaient si un montant était "0,00" au lieu de "0".

0
Dan Field