Сохраняются ли значения Date в SQL Server как одно целое?

8

SQL Server хранит DATETIMEвнутренне как два INTзначения, как объясняет SQLDenis .

Правильно ли (по логическому расширению), что DATEтипы (SQL Server 2008+) хранятся как единое целое INT?

Мэтью
источник

Ответы:

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);

Частичные результаты (будут немного отличаться в вашей системе):

----
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
Аарон Бертран
источник
Хм, а как насчет времени?
Азимут
@Azimuth Вопрос был о dateтом, у кого нет времени.
Аарон Бертран