Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какъв тип данни трябва да използвам за съхраняване на парични стойности?

Папучино,

Не препоръчвам типовете money и smallmoney, освен ако не сте сигурни, че единствената аритметика, която планирате да направите, е събиране и изваждане. Ако може да имате работа с обменни курсове, проценти и т.н., рискувате реални проблеми с тези видове.

Ето само един малък пример, за да ви покажем разликата между използването на пари, десетичен знак и число с плаваща единица, когато има деление. Възможно е да се измислят примери, където разликата е много по-драматична.

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;

Резултат:0.0028 0.0029 0.00289855072463768

В зависимост от индустрията може да има насоки или разпоредби, които да ви помогнат да вземете решение за правилния тип данни. Няма един правилен отговор.

Добавени забележки:

Вие сте прави, че парите/парите не трябва да са пари, но SQL Server (необяснимо) произвежда точно този резултат:въведете пари от частното на две парични стойности. Това е фалшиво, но както виждате от примера по-долу, това е, което получавате, въпреки че няма смисъл:

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

Резултат:0.0028 0.0028985507246376811

Резултатът с тип пари, 0,0028, е с 3-4% по-малък от правилния резултат.

Разбира се, има много ситуации, в които трябва да разделите валутните стойности. Опасността от използването на типа пари е, че коефициентът е грешен тип (и отговорът не е достатъчно близък до правилния). Примери за въпроси, които изискват разделяне на валута:

Да предположим, че обменяте 320 юана и банката ви дава 47,3 щатски долара. Какъв е обменният курс, който ви беше даден?

Да предположим, че инвестирате $23 и година по-късно това струва $31. Какъв е вашият процент на възвръщаемост?

И двете изчисления изискват разделяне на валутни стойности.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете идентификатора на обект от неговото име в SQL Server:OBJECT_ID()

  2. Как да използвате индекс в SQL заявка

  3. SQL заявка за броене на записи на месец

  4. Как да конвертирате цяло число (време) в HH:MM:SS::00 в SQL Server 2008?

  5. Въведение във вградените функции с таблично стойности (ITVF) в SQL Server