SQL Server中datetime的内部表示是什么?

11

SQL Server(2000和2005版本,如果有区别)中datetime值的基础数据结构是什么?即到字节表示为止?

假定当您选择datetime列时获得的默认表示形式是特定于文化的值/易于更改。也就是说,我们看不到的某些基础结构被格式化为YYYY-MM-DD HH:MM: SS.mmm。

我提出这个问题的原因是,在我们部门中普遍存在一种观点,即它以YYYY-MM-DD HH:MM:SS.mmm的形式直接存储在内存中,但我确定情况并非如此。

1个回答

18

作为一个8字节字段存储, 范围从1753-01-01到9999-12-31,精度为0.00333秒。

细节被认为是不透明的,但我在网上找到的大多数资源(1), (2)都表明以下内容:

前4个字节存储自SQL Server纪元(1900年1月1日)以来的天数,而后4个字节存储午夜后的滴答数,“滴答”是3.3毫秒。

前四个字节是有符号的(可以是正数或负数),这就解释了为什么可以表示早于纪元的日期。


8
这不正确。根据链接的文章:实际上,SQL Server确实在那里存储了从午夜以来的时钟滴答数。每个时钟滴答相当于3.33毫秒。这也是DATETIME数据类型精度为三百分之一秒的原因。同样,在BOL中也正确地说明了这一点。 - ctusch
3
@ctusch,我已经更新了答案(将近7年后!)以纠正“刻度”的大小。 - Roger Lipscombe
1
有趣的是,SQL Server文档使用了“准确性”一词。它应该说“精度”。 - Roger Lipscombe
更新:SQL Server 2019 使用8字节,其精度为“.000, .003 或 .007秒”。微软文档(https://learn.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15)并没有直接给出详细说明。但是单独的日期和时间类型分别使用3个和5个字节,并将时间精度定为100纳秒。 - Christopher J Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接