在SQL-Server中存储百分比值的最佳方法是什么?

Shi*_*mmy 63 sql t-sql sql-server types

我想存储一个表示SQL Server中百分比的值,应该选择哪种数据类型?

gbn*_*gbn 62

您应该在99.9%的情况下使用小数(p,s).

百分比只是一个表达概念:10%仍然是0.1.

当表示为实数时,只需选择最高预期值/所需小数位的精度和比例.对于值<100%,您可以使用p = s,并根据小数位数进行简单决定.

但是,如果您确实需要存储100%或1,那么您将需要p = s + 1.

这允许最多9.xxxxxx或9xx.xxxx%,所以我添加一个检查约束,以保持最大值1,如果这是我需要的全部.

  • 我需要一个%100-%0之间的值,它应该允许小数位(即%xx.xx),我使用小数(5,4),它最适合我. (3认同)
  • @Nico:永远不要在数据库中使用近似数字(例如“FLOAT”和“DOUBLE”)。您确实不需要它们,而且它们很容易引起问题。至于美分与欧元:那是无稽之谈。`DECIMAL` 是一种精确的数据类型;因此,存储 123.45 与 12345 一样精确。在数据库中不以其货币存储金额而是以子货币存储金额是没有意义的;这只会让人们感到困惑,并可能导致错误的计算和意想不到的结果。 (2认同)

Gut*_*Haz 37

十进制(p,s)和数字(p,s)

p(精度):

将存储的最大小数位数(小数点的左侧和右侧)


s(规模):

将存储在小数点右侧的小数位数( - > s定义小数位数)


0 <= s <= p.

  • p ...总位数
  • s ...小数点右边的位数
  • ps ...小数点左边的位数

例:

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;
Run Code Online (Sandbox Code Playgroud)

结果:

MyDecimalColumn: 123.00 (p=5, s=2)

MyNumericColumn: 12345.12000 (p=10, s=5)
Run Code Online (Sandbox Code Playgroud)

链接:msdn.microsoft.com


Aar*_*and 12

我同意,DECIMAL是您应该存储此类号码的地方.但是为了使决策更容易,将其存储为1的百分比,而不是100的百分比.这样,无论"整数"如何,您都可以精确存储所需的小数位数.因此,如果您想要6个小数位,请使用DECIMAL(9,8)和23.3436435%,存储0.23346435.将其更改为23.346435%是显示问题,而不是存储问题,并且大多数演示语言/报表编写者等都能够为您更改显示.


Shi*_*mmy 9

我认为应该使用decimal(p,s),而s代表百分比能力.'p'可以是1,因为我们永远不需要超过一个字节,因为该点左侧的每个数字都是一个百分比,所以p必须至少为s + 1,以便你能够存储高达1000%.但SQL不允许'p'小于s.

示例:28.2656579879%应为十进制(13,12)并应存储00.282656579879 128.2656579879%应为十进制(13,12)并应存储01.282656579879

28%应存储在十进制(3,2)中,因为0.28 128%应以十进制(3,2)存储为1.28

注意:如果你知道你不会达到100%(即你的值总是小于100%而不是使用小数(s,s),如果是,则使用小数(s + 1,s).

等等


OMG*_*ies 5

列的数据类型应为十进制。