Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quel type de données dois-je utiliser pour stocker des valeurs monétaires ?

Papuccino,

Je ne recommande pas les types money et smallmoney à moins que vous ne soyez certain que la seule arithmétique que vous envisagez de faire est l'addition et la soustraction. Si vous avez affaire à des taux de change, des pourcentages, etc., vous risquez de réels problèmes avec ces types.

Voici juste un petit exemple pour vous montrer une différence entre l'utilisation de l'argent, du nombre décimal et du flottant lorsque la division est impliquée. Il est possible de trouver des exemples où la différence est beaucoup plus dramatique.

declare @m1 money, @m2 money, @m3 money
declare @d1 decimal(19,4), @d2 decimal(19,4), @d3 decimal(19,4)
declare @f1 float, @f2 float, @f3 float;
set @m1 = 1.00;
set @m2 = 345.00;
set @m3 = @m1/@m2;
set @d1 = 1.00;
set @d2 = 345.00;
set @d3 = @d1/@d2;
set @f1 = 1.00;
set @f2 = 345.00;
set @f3 = @f1/@f2;
select @m3, @d3, @f3;

Résultat :0,0028 0,0029 0,00289855072463768

Selon l'industrie, il peut y avoir des directives ou des réglementations pour vous aider à choisir le bon type de données. Il n'y a pas qu'une seule bonne réponse.

Remarques ajoutées :

Vous avez raison de dire que money/money ne devrait pas être de l'argent, mais SQL Server (inexplicablement) produit exactement ce résultat :tapez money à partir du quotient de deux valeurs monétaires. C'est faux, mais comme vous le voyez dans l'exemple ci-dessous, c'est ce que vous obtenez, même si cela n'a aucun sens :

declare @m1 money, @m2 money;
declare @d1 decimal(19,4), @d2 decimal(19,4);
set @m1 = 1.00;
set @m2 = 345.00;
set @d1 = 1.00;
set @d2 = 345.00;
select @m1/@m2, @d1/@d2

Résultat :0,0028 0,0028985507246376811

Le résultat avec le type argent, 0,0028, est de 3 à 4 % inférieur au résultat correct.

Bien sûr, il existe de nombreuses situations où vous devez diviser les valeurs monétaires. Le danger d'utiliser le type monétaire est que le quotient est le mauvais type (et une réponse pas assez proche de la bonne). Exemples de questions nécessitant une devise de division :

Supposons que vous échangez 320 yuans et que la banque vous donne 47,3 dollars américains. Quel est le taux de change qu'on vous a donné ?

Supposons que vous investissiez 23 $ et qu'un an plus tard, cela vaut 31 $. Quel est votre taux de rendement ?

Ces deux calculs nécessitent de diviser les valeurs monétaires.