sql >> Database teknologi >  >> RDS >> Sqlserver

Hvilken datatype skal jeg bruge til at gemme pengeværdier?

Papuccino,

Jeg anbefaler ikke typerne penge og småpenge, medmindre du er sikker på, at den eneste aritmetik, du planlægger at lave, er addition og subtraktion. Hvis du måske har at gøre med valutakurser, procenter og så videre, risikerer du reelle problemer med disse typer.

Her er blot et lille eksempel for at vise dig forskellen mellem at bruge penge, decimal og float, når division er involveret. Det er muligt at komme med eksempler, hvor forskellen er meget mere 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

Afhængigt af branchen kan der være retningslinjer eller regler, der hjælper dig med at beslutte den rigtige datatype. Der er ikke ét rigtigt svar.

Tilføjede bemærkninger:

Du har ret i, at penge/penge ikke skal være penge, men SQL Server producerer (uforklarligt) præcis det resultat:skriv penge fra kvotienten af ​​to pengeværdier. Dette er falsk, men som du kan se fra eksemplet nedenfor, er det, hvad du får, selvom det ikke giver nogen mening:

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 typepenge, 0,0028, er 3-4 % mindre end det korrekte resultat.

Selvfølgelig er der mange situationer, hvor du skal opdele valutaværdier. Faren ved at bruge pengetypen er, at kvotienten er den forkerte type (og et svar, der ikke er tæt nok på det rigtige). Eksempler på spørgsmål, der kræver opdeling af valuta:

Antag, at du veksler 320 Yuan, og banken giver dig 47,3 amerikanske dollars. Hvad er den valutakurs, du har fået?

Antag, at du investerer 23 USD og et år senere er det 31 USD værd. Hvad er din procentvise afkast?

Begge disse beregninger kræver opdeling af valutaværdier.



  1. Opdater en række, men indsæt, hvis rækken ikke findes i kodetænder

  2. Hvordan viser man indhold fra flere QSqlTableModels i én QTableView?

  3. PHP / MySQL-fejl ved forespørgsel efter e-mail-adresse

  4. rekursiv funktion for at få alle børnekategorier