如SQLDenis所述,SQL Server在DATETIME
内部存储为两个INT
值。
DATE
类型(SQL Server 2008+)作为单个 存储是否正确(通过逻辑扩展名)INT
?
如SQLDenis所述,SQL Server在DATETIME
内部存储为两个INT
值。
DATE
类型(SQL Server 2008+)作为单个 存储是否正确(通过逻辑扩展名)INT
?
Answers:
只是为了好玩,让我们看看页面上有什么。
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);
部分结果(在您的系统上会有所不同):
----
13
PagePID iam_chain_type PageType
------- -------------- --------
229 In-row data 10
228 In-row data 1
因此,让我们看一下第228页:
DBCC TRACEON(3604, -1);
DBCC PAGE(13, 1, 228, 3);
部分结果。我们看到d的值占用3个字节。如果我们查看该行的内存转储,则会看到内部存储组件的十六进制值:c8350b02
-那是什么?
SELECT DATEDIFF(DAY, CONVERT(DATE, '0001-01-01'), CONVERT(DATE, '2012-06-11'));
结果:
734664
所以:
SELECT CONVERT(VARBINARY(8), 734664);
结果:
0x000B35C8
(看起来与页面上的内容非常相似,只是位的翻转方向相反?)
然后:
SELECT DATEADD(DAY, CONVERT(INT, 0x000B35C8), CONVERT(DATE, '0001-01-01'))
结果:
2012-06-11
date
哪个没有时间。