sql >> Databáze >  >> RDS >> Sqlserver

Jaký typ dat bych měl použít k ukládání peněžních hodnot?

Papuccino,

Nedoporučuji typy peněz a malých peněz, pokud si nejste jisti, že jedinou aritmetikou, kterou plánujete udělat, je sčítání a odčítání. Pokud máte co do činění se směnnými kurzy, procenty a tak dále, riskujete u těchto typů skutečné problémy.

Zde je jen jeden malý příklad, který vám ukáže rozdíl mezi používáním peněz, desítkové soustavy a pohyblivé, pokud jde o dělení. Je možné vymyslet příklady, kde je rozdíl mnohem dramatičtější.

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;

Výsledek:0,0028 0,0029 0,00289855072463768

V závislosti na odvětví mohou existovat pokyny nebo předpisy, které vám pomohou rozhodnout se pro správný typ dat. Neexistuje žádná správná odpověď.

Přidané poznámky:

Máte pravdu, že peníze/peníze by neměly být peníze, ale SQL Server (nevysvětlitelně) vytváří přesně ten výsledek:zadejte peníze z podílu dvou peněžních hodnot. To je falešné, ale jak vidíte z příkladu níže, je to to, co dostanete, i když to nedává smysl:

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

Výsledek:0,0028 0,0028985507246376811

Výsledek s typem peníze, 0,0028, je o 3–4 % nižší než správný výsledek.

Samozřejmě existuje mnoho situací, kdy potřebujete rozdělit hodnoty měny. Nebezpečí použití peněžního typu spočívá v tom, že kvocient je nesprávného typu (a odpověď není dostatečně blízká správné). Příklady otázek, které vyžadují rozdělení měny:

Předpokládejme, že si směníte 320 juanů a banka vám dá 47,3 amerických dolarů. Jaký je směnný kurz, který jste dostali?

Předpokládejme, že investujete 23 USD a o rok později to bude mít hodnotu 31 USD. Jaká je vaše procentuální míra návratnosti?

Oba tyto výpočty vyžadují rozdělení hodnot měn.



  1. Proč se výsledek COUNT zdvojnásobí, když se připojím dva?

  2. Existuje nějaký důvod, proč používat primární klíč i jedinečný klíč společně ve stejném poli?

  3. Jak zobrazit obrázek z mysql blob

  4. Jak najít zamčené řádky v Oracle