Odpowiedni typ danych do przechowywania wartości procentowych?

Jaki jest najlepszy typ danych do przechowywania wartości procentowych od 0,00% do 100,00%?

Author: Jeff, 2010-05-04

5 answers

Zakładając dwa miejsca po przecinku na procentach, typ danych, którego używasz, zależy od tego, jak zamierzasz przechowywać swoje procenty. Jeśli zamierzasz przechowywać ich ułamkowy odpowiednik (np. 100.00% zapisane jako 1.0000), chciałbym przechowywać dane w typie danych decimal(5,4) z ograniczeniem CHECK, który zapewnia, że wartości nigdy nie przekraczają 1.0000 (zakładając, że jest to cap) i nigdy nie schodzą poniżej 0 (zakładając, że jest to Podłoga). Jeśli zamierzasz zapisać ich wartość nominalną (np. 100.00% jest zapisywane jako 100.00), to powinien używać {[2] } z odpowiednim ograniczeniem CHECK. W połączeniu z dobrą nazwą kolumny, wyjaśnia innym programistom, jakie są dane i w jaki sposób dane są przechowywane w kolumnie.

 93
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-15 21:01:29
  • Hold as a decimal.
  • Dodaj ograniczenia wyboru, jeśli chcesz ograniczyć zakres (np. od 0 do 100%; w niektórych przypadkach mogą istnieć ważne powody, aby wykraczać poza 100% lub potencjalnie nawet do negatywów).
  • traktuj wartość 1 jako 100%, 0,5 jako 50% itd. Pozwoli to na działanie dowolnych operacji matematycznych zgodnie z oczekiwaniami (tj. w przeciwieństwie do użycia wartości 100 jako 100%).
  • Zmień dokładność i skalę zgodnie z wymaganiami (są to dwie wartości w nawiasach columnName decimal(precision, scale). Precision says the całkowita liczba cyfr, które mogą być utrzymane w liczbie, skala mówi, ile z nich jest po przecinku, więc {[3] } jest liczbą, która może być reprezentowana jako #.##; decimal(5,3) byłoby ##.###.
  • decimal i numeric są zasadniczo tym samym. Jednak {[1] } jest zgodny z ANSI, więc zawsze używaj tego, o ile nie powiedziano inaczej (np. przez standardy kodowania Twojej firmy).

Przykładowe Scenariusze

  • dla Twojego przypadku (0,00% do 100,00%) chcesz decimal(5,4).
  • dla najczęstszy przypadek (0% do 100%), który chcesz decimal(3,2).
  • w obu powyższych ograniczeniach kontrola będzie taka sama

Przykład:

if object_id('Demo') is null
create table Demo
    (
        Id bigint not null identity(1,1) constraint pk_Demo primary key
        , Name nvarchar(256) not null constraint uk_Demo unique 
        , SomePercentValue decimal(3,2) constraint chk_Demo_SomePercentValue check (SomePercentValue between 0 and 1)
        , SomePrecisionPercentValue decimal(5,2) constraint chk_Demo_SomePrecisionPercentValue check (SomePrecisionPercentValue between 0 and 1)
    )

Czytaj Dalej:

 16
Author: JohnLBevan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:50

Jeśli 2 miejsca po przecinku to twój poziom precyzji, wtedy "smallint" obsłuży to w najmniejszej przestrzeni (2-bajty). Zapisujesz procent pomnożony przez 100.

EDIT: typ dziesiętny jest prawdopodobnie lepszym dopasowaniem. Wtedy nie musisz ręcznie skalować. Zajmuje 5 bajtów na wartość.

 2
Author: mdma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 01:54:01

Zgadzam się z Thomasem i wybrałbym rozwiązanie dziesiętne(5,4) przynajmniej dla aplikacji WPF.

Spójrz na ciąg liczbowy formatu MSDN, aby wiedzieć, dlaczego : http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

Specyfikacja formatu percent ("P") mnoży liczbę przez 100 i zamienia ją na ciąg, który reprezentuje procent.

Wtedy będziesz mógł użyć tego w swoim kodzie XAML:

DataFormatString="{}{0:P}"
 1
Author: pjehan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 08:48:59

Użyj liczb (n,n), gdzie n ma wystarczającą rozdzielczość do zaokrąglenia do 1.00. Na przykład:

declare @discount numeric(9,9)
    , @quantity int
select @discount = 0.999999999
    , @quantity = 10000

select convert(money, @discount * @quantity)
 0
Author: user2202942,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 20:56:33