【问题标题】:What is really the Accuracy means in SQL Server (Date Time)SQL Server(日期时间)中真正的准确性意味着什么
【发布时间】:2020-11-25 15:14:36
【问题描述】:

我真的对 SQL Server 中名为 Accuracy 的东西感到困惑。

我在SQL server 中找到了一些关于datetime 数据类型的信息,但我观察到了一些名为准确性的东西。 那么请有人帮我解释一下,用一种简单的方式来理解accuracy 的真正含义是什么? 提前万分感谢。

【问题讨论】:

  • “我观察到了一个名为准确性的东西” 你在哪里“观察到”这个?当你看到这个“准确”的东西时,你在做什么?你是说datetime 精确到1/300 秒,而datetime2(n) 精确到1/(10*n) 秒?
  • 我的意思是 SQL Server 中日期时间的准确度,准确度是什么意思?
  • datetime 精确到 1/300 秒;它没有准确度属性。
  • 好的,但是请您解释一下准确性是什么意思?我在这个链接中找到了这个w3schools.com/sql/sql_datatypes.asp
  • 这告诉你正是我刚才在上面的 cmets 中提到的准确性... “精度为 3.33 毫秒” = "精确到 1/300 秒"

标签: sql-server datetime


【解决方案1】:

这取决于您拥有多少位以及您决定使用多少位。 1 位有 2 个可能的值。 2 位有 4。3 有 8。通常,给定 n 位存储,有 2^n 可能的不同值。一个 8 位的字节可以有 256 个值。

对于存储在一个字节中的正整数,范围是 0 到 255,因为零被视为一个可能的值。包括负数不会改变值的数量。例如,有符号字节的范围可以是 -127 到 128。(2 的补码对硬件来说很方便。)

对于有范围限制的整数来说,事情是“精确的”。对于时间或距离之类的东西,我们使用实数。实数的一个性质是在任意两个实数之间存在无限个实数。如果我们选择一个范围,则没有足够的字节来表示它们之间的所有实数。我们通过将一些位分配给指数和一些位分配给尾数来近似数字。

长话短说,我们分配固定数量的位来表示给定范围内的无限数量的时间值。

对于 smalldatetime,第一个 2 个字节是日期,第二个 2 个字节是时间。对于日期时间,每个都是 4 个字节。 2 个字节的 smalldatetime 天部分允许 2^16 个值或 65536 天。 65536 *(1 年/265 天)= 179 与 smalldatetime 的年份范围匹配。对于日期时间部分,2^32 / 365 = 11767 年大于使用的日期时间范围 1753 到 9999。存储在那里,但工程师不必使用它。

现在是时间部分。日期时间可以转换为浮点数。整数部分是一天,小数部分是一天的小数部分。 (这不适用于 datetime2。)

如果我们使用时间部分的每一位,那么 2 个字节允许 65,536 个值,4 个字节允许一天 4,294,967,296 个值。这些是每种方法的最佳精度。

24 hr * (3600 sec/ 1 hr) * (1000 ms / 1 sec) / 4,294,967,296  = .02 milliseconds
24 hr * (3600 sec/ 1 hr) / 1 sec) / 65,536 = 1.3 seconds  

这些不是 Microsoft 工程师决定使用的精度;但是,它们是可以存储在这个字节数中的最好的。选择 3ms 精度可能与当时的硬件和 API 限制有关。 (慢速硬件时钟可能是唯一的标准。)1 分钟的精度可能是向上取整。没有一秒钟,所以让我们把它四舍五入到分钟。

最终结果是,如果您测量从现在到一毫秒之间的时间 100 万次并将其存储在日期时间中,您将看到最多存储 1 或 2 个不同的值。如果将其存储为 smalldatetime,您最多会看到 1 或 2 个不同的值。如果你看到2个值,那是因为你越过了下一个值的区间。

清如泥?

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2019-10-20
    • 2020-06-21
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多