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

Quale tipo di dati devo usare per memorizzare i valori monetari?

Papuccino,

Non consiglio i tipi money e smallmoney a meno che tu non sia certo che l'unica aritmetica che intendi fare sia addizione e sottrazione. Se hai a che fare con tassi di cambio, percentuali e così via, rischi seri problemi con questi tipi.

Ecco solo un piccolo esempio per mostrarti la differenza tra l'uso di denaro, decimale e float quando è coinvolta la divisione. È possibile trovare esempi in cui la differenza è molto più drammatica.

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;

Risultato:0,0028 0,0029 0,00289855072463768

A seconda del settore, potrebbero esserci linee guida o normative per aiutarti a decidere il giusto tipo di dati. Non c'è una risposta giusta.

Osservazioni aggiunte:

Hai ragione sul fatto che denaro/denaro non dovrebbe essere denaro, ma SQL Server (inspiegabilmente) produce esattamente quel risultato:digita denaro dal quoziente di due valori monetari. Questo è falso, ma come vedi dall'esempio qui sotto, è quello che ottieni, anche se non ha senso:

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

Risultato:0,0028 0,0028985507246376811

Il risultato con il tipo money, 0,0028, è del 3-4% in meno rispetto al risultato corretto.

Naturalmente, ci sono molte situazioni in cui è necessario dividere i valori delle valute. Il pericolo di utilizzare il tipo di denaro è che il quoziente è del tipo sbagliato (e una risposta non abbastanza vicina a quella corretta). Esempi di domande che richiedono la divisione della valuta:

Supponiamo di scambiare 320 Yuan e la banca ti dia 47,3 dollari USA. Qual è il tasso di cambio che ti è stato assegnato?

Supponiamo di investire $ 23 e un anno dopo valga $ 31. Qual è il tuo tasso di rendimento percentuale?

Entrambi questi calcoli richiedono la divisione dei valori di valuta.