用于保存百分比值的适当数据类型?

Use*_*ser 90 sql-server types sqldatatypes

保持百分比值从0.00%到100.00%的最佳数据类型是什么?

Tho*_*mas 110

假设您的百分比有两位小数,您使用的数据类型取决于您计划存储百分比的方式.如果你要存储它们的小数等价物(例如100.00%存储为1.0000),我会将数据存储在一个decimal(5,4)数据类型中,其CHECK约束条件确保值不会超过1.0000(假设是上限)并且永远不会低于0 (假设那是地板).如果要存储其面值(例如,100.00%存储为100.00),则应使用decimal(5,2)适当的CHECK约束.结合良好的列名称,它使其他开发人员清楚地知道数据是什么以及数据如何存储在列中.

  • 不应该是`decimal(5,2)`其中2表示小数分隔符后面的位数? (10认同)
  • 我假设这最初有`decimal(5,4)`并且在上面的注释之后被改为`decimal(5,2)`我认为`decimal(5,4)`将是更好的定义 - 即你想要存储0到1,带有2个小数位,而不是0到100.百分比的原因是100; 所以100%是100/100这是1.这样做对大多数情况更有意义(例如`100%*100%= 100%`,而不是'10000%`;`1*1 = 1`). (4认同)
  • @JohnLBevan - 它花费在存储方式上.如果值将按显示的方式存储(例如"100.00"),那么您需要`decimal(5,2)`.如果值将作为分数存储(例如`1.0000`),那么你需要`decimal(5,4)`.将更新帖子. (4认同)
  • @BorisCallens - 无法相信这些年来我都错过了.是的,这是一个错字.`decimal(5,2)`是应该使用检查约束捕获的内容. (2认同)

Joh*_*van 21

  • 保持为decimal.
  • 如果要限制范围,请添加检查约束(例如,在0到100%之间;在某些情况下,可能有正当理由超出100%或甚至可能进入负数).
  • 将值1视为100%,将0.5视为50%等.这将允许任何数学运算按预期运行(即,与使用值100作为100%相反).
  • 根据需要修改精度和比例(这些是括号中的两个值columnName decimal(precision, scale).精度表示数字中可以保存的总位数,刻度表示其中有多少位于小数位后面,因此decimal(3,2)是一个可以表示的数字as #.##; decimal(5,3)会的##.###.
  • decimal并且numeric基本上是一回事.但是decimal,除非另有说明(例如,根据贵公司的编码标准),否则始终使用ANSI.

示例场景

  • 对于你的情况(0.00%到100.00%)你想要的decimal(5,4).
  • 对于最常见的情况(0%到100%),你想要的decimal(3,2).
  • 在上述两种情况中,检查约束都是相同的

例:

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

进一步阅读: