SQL Server 的日期值是否存储为单个整数?

Mat*_*hew 8 sql-server

正如SQLDenis 解释的DATETIME那样INT,SQL Server 在内部存储为两个值。

DATE类型(SQL Server 2008+)存储为单个 是否正确(按逻辑扩展)INT

Aar*_*and 11

只是为了好玩,让我们看看页面上有什么。

CREATE DATABASE floob;
GO
USE floob;
GO
CREATE TABLE dbo.experiment(d DATE NOT NULL);
CREATE CLUSTERED INDEX x ON dbo.experiment(d);
INSERT dbo.experiment SELECT SYSDATETIME();

DBCC IND('floob', 'dbo.experiment', 1);
Run Code Online (Sandbox Code Playgroud)

部分结果(在您的系统上会有所不同):

----
13

PagePID iam_chain_type PageType
------- -------------- --------
229     In-row data    10
228     In-row data    1
Run Code Online (Sandbox Code Playgroud)

那么让我们看看第 228 页:

DBCC TRACEON(3604, -1);
DBCC PAGE(13, 1, 228, 3);
Run Code Online (Sandbox Code Playgroud)

部分结果。我们看到 d 的值占据了 3 个字节。如果我们查看该行的内存转储,我们会看到内部存储组件的十六进制值:c8350b02- 那可能是什么?

在此处输入图片说明

SELECT DATEDIFF(DAY, CONVERT(DATE, '0001-01-01'), CONVERT(DATE, '2012-06-11'));
Run Code Online (Sandbox Code Playgroud)

结果:

734664
Run Code Online (Sandbox Code Playgroud)

所以:

SELECT CONVERT(VARBINARY(8), 734664);
Run Code Online (Sandbox Code Playgroud)

结果:

0x000B35C8
Run Code Online (Sandbox Code Playgroud)

(看起来与页面上的非常相似,只是位以相反的顺序翻转?)

然后:

SELECT DATEADD(DAY, CONVERT(INT, 0x000B35C8), CONVERT(DATE, '0001-01-01'))
Run Code Online (Sandbox Code Playgroud)

结果:

2012-06-11
Run Code Online (Sandbox Code Playgroud)