sql-server - texto - tipos de indices en sql
¿Tipo de datos apropiado para mantener los valores porcentuales? (5)
Estoy de acuerdo con Thomas y elegiría la solución DECIMAL (5,4) al menos para las aplicaciones de WPF.
Eche un vistazo a la cadena de formato numérico de MSDN para saber por qué: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
El especificador de formato de porcentaje ("P") multiplica un número por 100 y lo convierte en una cadena que representa un porcentaje.
Entonces, podrías usar esto en tu código XAML:
DataFormatString="{}{0:P}"
¿Cuál es el mejor tipo de datos para mantener los valores porcentuales que van del 0.00% al 100.00%?
Si 2 cifras decimales son su nivel de precisión, una "smallint" manejaría esto en el espacio más pequeño (2 bytes). Usted almacena el porcentaje multiplicado por 100.
EDIT: el tipo http://msdn.microsoft.com/en-us/library/aa258832%28SQL.80%29.aspx es probablemente una mejor coincidencia. Entonces no necesita escalar manualmente. Toma 5 bytes por valor.
Use numérico (n, n) donde n tiene suficiente resolución para redondear a 1.00. Por ejemplo:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)
Suponiendo dos decimales en sus porcentajes, el tipo de datos que usa depende de cómo planea almacenar sus porcentajes. Si vas a almacenar su equivalente fraccionario (por ejemplo, 100.00% almacenado como 1.0000), almacenaría los datos en un tipo de datos decimal(5,4)
con una restricción CHECK
que asegura que los valores nunca excedan 1.0000 (suponiendo que sea el cap) y nunca ir por debajo de 0 (suponiendo que sea el piso). Si va a almacenar su valor nominal (p. Ej., 100,00% se almacena como 100,00), debe usar decimal(5,2)
con una restricción CHECK
apropiada. Combinado con un buen nombre de columna, deja en claro a otros desarrolladores qué datos son y cómo se almacenan los datos en la columna.
- Mantenga como un
decimal
. - Agregue restricciones de verificación si desea limitar el rango (por ejemplo, entre 0 y 100%, en algunos casos puede haber razones válidas para ir más allá del 100% o incluso potencialmente en los negativos).
- Trate el valor 1 como 100%, 0.5 como 50%, etc. Esto permitirá que las operaciones matemáticas funcionen como se espera (es decir, a diferencia del uso del valor 100 como 100%).
- Modifique la precisión y la escala según sea necesario (estos son los dos valores entre paréntesis
columnName decimal(precision, scale)
. La precisión indica el número total de dígitos que se pueden mantener en el número, la escala indica cuántos de ellos están después del lugar decimal, por lodecimal(3,2)
es un número que se puede representar como#.##
;decimal(5,3)
sería##.###
. -
decimal
ynumeric
son esencialmente lo mismo. Sin embargo, eldecimal
es compatible con ANSI, por lo tanto, siempre utilícelo a menos que se indique lo contrario (por ejemplo, según los estándares de codificación de su empresa).
Escenarios de ejemplo
- Para su caso (0.00% a 100.00%) querría
decimal(5,4)
. - Para el caso más común (0% a 100%), querrás
decimal(3,2)
. - En ambos de los anteriores, las restricciones de verificación serían las mismas
Ejemplo:
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)
)
Otras lecturas:
- Escala decimal y precisión: http://msdn.microsoft.com/en-us/library/aa258832%28SQL.80%29.aspx
-
0 to 1
frente a0 to 100
: C #: ¿Almacenamiento de porcentajes, 50 o 0,50? - Decimal vs Numérico: ¿Hay alguna diferencia entre DECIMAL y NUMERIC en SQL Server?