【问题标题】:TSQL datetime sizeTSQL 日期时间大小
【发布时间】:2013-06-06 10:56:09
【问题描述】:

我在浏览 msdn 关于 T-SQL 中的数据类型大小时发现了一些我有点困惑的东西。

根据http://msdn.microsoft.com/en-us/library/ms186724.aspx,datetime 使用 8 个字节并存储 1753-9999 年的日期,时间精度为 hh:mm:ss[.nnn]。现在,如果您分别查看日期和时间,时间使用 3-5 个字节存储 hh:mm:ss[.nnnnnnn],日期使用 3 个字节存储从 0 到 9999 年。

让我感到困惑的是,分别使用日期和时间为您提供了比日期时间多四位精度的更广泛的年份和时间,但它们都使用 8 个字节?为什么 datetime 的范围更小,精度更低,却使用相同的大小来存储自己?

【问题讨论】:

  • DATETIME 早在很久以前就已经存在了 - 它可能不如新的 DATETIME(和 DATETIME2)数据类型优化。
  • 同意 marc_s - 如果您想要(更)高效,请使用datetime2datetime 已经存在了几十年,不一定是最好的选择。
  • 即使将 DATE 年 0-9,999 存储为 3 个字节似乎完全是任意的。 3 个字节可以包含 2^24 个值(将近 1700 万个)。但一万年只包含 360 万个不同的日期。因此,他们实际上可以存储从 -20,000(公元前 20,000 年)到 20,000 年的年份。任何人都知道为什么他们不会尝试使用全套可用值?我认为内部存储结构的某些内容可以提高(处理方面)存储更少值的效率。

标签: sql-server tsql date datetime time


【解决方案1】:

日期时间数据类型位于单独的日期和时间数据类型之前。 Datetime 数据类型使用 8 个字节,作为两个整数。第一个整数将 01/01/1900 存储为 0,1900 年之前的任何天都存储为负天数,之后的任何日期都存储为正整数,表示 01/01/1900 之后的天数。

日期仅从 1753 年开始的原因是,这是公历的开始日期,在此之前的任何日子,您都需要知道所在国家/地区才能确定日期。这是最初的 Sybase 开发人员做出的决定,而 Sql Server 就是由此而来。

时间整数部分存储自午夜以来的滴答数。一个刻度是 1/300 秒。

可以在这里找到好的示例和信息; http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-are-dates-stored-in-sql-serverhttp://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2010-12-21
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多