sql >> Databasteknik >  >> RDS >> Sqlserver

Vilken datatyp ska jag använda för att lagra monetära värden?

Papuccino,

Jag rekommenderar inte typerna pengar och småpengar om du inte är säker på att den enda aritmetiken du tänker göra är addition och subtraktion. Om du kanske har att göra med växelkurser, procentsatser och så vidare riskerar du verkliga problem med dessa typer.

Här är bara ett litet exempel för att visa dig skillnaden mellan att använda pengar, decimal och flytande när division är inblandat. Det går att komma med exempel där skillnaden är mycket mer dramatisk.

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;

Resultat:0,0028 0,0029 0,00289855072463768

Beroende på bransch kan det finnas riktlinjer eller bestämmelser som hjälper dig att välja rätt datatyp. Det finns inget rätt svar.

Tillagda kommentarer:

Du har rätt i att pengar/pengar inte ska vara pengar, men SQL Server ger (oförklarligt) exakt det resultatet:skriv pengar från kvoten av två pengavärden. Detta är falskt, men som du ser från exemplet nedan är det vad du får, även om det inte är meningsfullt:

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

Resultat:0,0028 0,0028985507246376811

Resultatet med typ pengar, 0,0028, är 3-4 % mindre än det korrekta resultatet.

Naturligtvis finns det många situationer där du behöver dela upp valutavärden. Faran med att använda pengatypen är att kvoten är fel typ (och ett svar som inte är tillräckligt nära det korrekta). Exempel på frågor som kräver att dela valuta:

Anta att du byter 320 Yuan och banken ger dig 47,3 US-dollar. Vilken är växelkursen du har fått?

Anta att du investerar 23 USD och ett år senare är det värt 31 USD. Vad är din procentuella avkastning?

Båda dessa beräkningar kräver att valutavärden divideras.



  1. Bulk DELETE på SQL Server 2008 (Finns det något liknande Bulk Copy (bcp) för radering av data?)

  2. sqlalchemy och automatiska inkrement med postgresql

  3. Undantag för överträdelse av begränsningar ORA-00001

  4. Hur påverkar index databasprestanda?