Ich möchte einen Wert speichern, der ein Prozent in SQL Server darstellt. Welcher Datentyp sollte der bevorzugte sein?
Ich möchte einen Wert speichern, der ein Prozent in SQL Server darstellt. Welcher Datentyp sollte der bevorzugte sein?
Antworten:
dezimal (p, s) und numerisch (p, s)
p (Genauigkeit):
Die maximale Gesamtzahl der Dezimalstellen, die gespeichert werden (links und rechts vom Dezimalpunkt).
s (Skala):
Die Anzahl der Dezimalstellen, die rechts vom Dezimalpunkt gespeichert werden (-> s definiert die Anzahl der Dezimalstellen).
0 <= s <= p.
Beispiel:
CREATE TABLE dbo.MyTable
( MyDecimalColumn decimal(5,2)
,MyNumericColumn numeric(10,5)
);
INSERT INTO dbo.MyTable VALUES (123, 12345.12);
SELECT MyDecimalColumn, MyNumericColumn FROM dbo.MyTable;
Ergebnis:
MyDecimalColumn: 123.00 (p=5, s=2)
MyNumericColumn: 12345.12000 (p=10, s=5)
In 99,9% der Fälle sollten Sie Dezimalstellen (p, s) verwenden.
Prozent ist nur ein Präsentationskonzept: 10% sind immer noch 0,1.
Wählen Sie einfach Präzision und Skalierung für die höchsten erwarteten Werte / gewünschten Dezimalstellen, ausgedrückt als reelle Zahlen. Sie können p = s für Werte <100% haben und einfach anhand von Dezimalstellen entscheiden.
Wenn Sie jedoch 100% oder 1 speichern müssen, benötigen Sie p = s + 1.
Dies erlaubt dann bis zu 9.xxxxxx oder 9xx.xxxx%, also würde ich eine Prüfbedingung hinzufügen, um sie auf maximal 1 zu halten, wenn dies alles ist, was ich brauche.
FLOAT
und DOUBLE
). Sie brauchen sie wirklich nicht und sie können leicht Probleme verursachen. Was Cent gegen Euro betrifft: Das ist Unsinn. DECIMAL
ist ein genauer Datentyp; und das Speichern von 123.45 ist somit so genau wie 12345. Es macht keinen Sinn, einen Betrag nicht in seiner Währung, sondern in einer Unterwährung in einer Datenbank zu speichern; es würde nur Menschen verwirren und könnte somit zu falschen Berechnungen und unerwarteten Ergebnissen führen.
Ich bin damit einverstanden, DECIMAL ist der Ort, an dem Sie diese Art von Nummer speichern sollten. Um die Entscheidung zu erleichtern, speichern Sie sie als Prozentsatz von 1 und nicht als Prozentsatz von 100. Auf diese Weise können Sie genau die Anzahl der benötigten Dezimalstellen speichern, unabhängig von der "ganzen" Zahl. Wenn Sie also 6 Dezimalstellen möchten, verwenden Sie DECIMAL (9, 8) und für 23.3436435% speichern Sie 0.23346435. Das Ändern auf 23.346435% ist ein Anzeigeproblem, kein Speicherproblem, und die meisten Präsentationssprachen / Berichtersteller usw. können die Anzeige für Sie ändern.
Ich denke, Dezimal (p, s) sollte verwendet werden, während s die prozentuale Fähigkeit darstellt. Das 'p' könnte sogar 1 sein, da wir nie mehr als ein Byte benötigen werden, da jede Ziffer auf der linken Seite des Punktes einhundert Prozent beträgt. Das p muss also mindestens s + 1 sein, damit Sie dies können Speichern Sie bis zu 1000%. SQL erlaubt jedoch nicht, dass das 'p' kleiner als das s ist.
Beispiele: 28.2656579879% sollten dezimal (13, 12) sein und gespeichert werden 00.282656579879 128.2656579879% sollten dezimal (13, 12) sein und sollten 01.282656579879 gespeichert werden
28% sollten als 0,28 dezimal (3,2) gespeichert werden. 128% sollten als 1,28 dezimal (3,2) gespeichert werden
Hinweis: Wenn Sie wissen, dass Sie die 100% nicht erreichen werden (dh Ihr Wert ist immer kleiner als 100% als bei Verwendung von Dezimalstellen (s, s), verwenden Sie gegebenenfalls Dezimalzahlen (s + 1, s).
Und so weiter