Просто для удовольствия, давайте посмотрим, что на странице.
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
том, у кого нет времени.