sql >> Database >  >> RDS >> Sqlserver

Welk gegevenstype moet ik gebruiken om geldwaarden op te slaan?

Papuccino,

Ik raad de soorten geld en kleingeld niet aan, tenzij je zeker weet dat optellen en aftrekken de enige rekensom is die je van plan bent te doen. Als je te maken hebt met wisselkoersen, percentages, enzovoort, riskeer je echte problemen met deze typen.

Hier is slechts een klein voorbeeld om u het verschil te laten zien tussen het gebruik van geld, decimaal en float wanneer er sprake is van delen. Het is mogelijk om voorbeelden te bedenken waar het verschil veel dramatischer is.

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;

Resultaat:0,0028 0,0029 0,00289855072463768

Afhankelijk van de branche kunnen er richtlijnen of voorschriften zijn om u te helpen bij het kiezen van het juiste gegevenstype. Er is niet één juist antwoord.

Opmerkingen toegevoegd:

Je hebt gelijk dat geld/geld geen geld zou moeten zijn, maar SQL Server produceert (op onverklaarbare wijze) precies dat resultaat:typ geld uit het quotiënt van twee geldwaarden. Dit is nep, maar zoals je kunt zien in het onderstaande voorbeeld, is het wat je krijgt, ook al slaat het nergens op:

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

Resultaat:0,0028 0,0028985507246376811

Het resultaat met typegeld, 0,0028, is 3-4% minder dan het juiste resultaat.

Natuurlijk zijn er veel situaties waarin u valutawaarden moet verdelen. Het gevaar van het gebruik van het geldtype is dat het quotiënt van het verkeerde type is (en een antwoord dat niet dicht genoeg bij het juiste ligt). Voorbeelden van vragen waarbij valuta moet worden gedeeld:

Stel dat u 320 Yuan omwisselt en de bank geeft u 47,3 Amerikaanse dollars. Wat is de wisselkoers die je hebt gekregen?

Stel dat u $23 investeert en een jaar later is het $31 waard. Wat is uw rendementspercentage?

Beide berekeningen vereisen het delen van valutawaarden.



  1. Installatie van MySQL-python mislukt met afsluitstatus 1120

  2. Voeg UTC/GMT-datum in Oracle-database in met Java en Spring

  3. toegang krijgen tot een kolomaliassen in de waar-clausule in postgresql

  4. Verschil tussen sys.sql_modules, sys.system_sql_modules en sys.all_sql_modules in SQL Server