Os valores de Data do SQL Server são armazenados como um único int?

8

O SQL Server armazena DATETIMEinternamente como dois INTvalores, como explica o SQLDenis .

É correto (por extensão lógica) que os DATEtipos (SQL Server 2008+) sejam armazenados como um único INT ?

Mateus
fonte

Respostas:

11

Apenas por diversão, vamos ver o que está na página.

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

Resultados parciais (diferem um pouco no seu sistema):

----
13

PagePID iam_chain_type PageType
------- -------------- --------
229     In-row data    10
228     In-row data    1

Então, vamos olhar para a página 228:

DBCC TRACEON(3604, -1);
DBCC PAGE(13, 1, 228, 3);

Resultados parciais. Vemos que o valor para d ocupa 3 bytes. Se olharmos para o despejo de memória da linha, vemos um valor hexadecimal para o componente de armazenamento interno: c8350b02- o que poderia ser isso?

insira a descrição da imagem aqui

SELECT DATEDIFF(DAY, CONVERT(DATE, '0001-01-01'), CONVERT(DATE, '2012-06-11'));

Resultado:

734664

Assim:

SELECT CONVERT(VARBINARY(8), 734664);

Resultado:

0x000B35C8

(Parece incrivelmente semelhante ao que está na página, apenas com os bits invertidos na ordem oposta?)

Então:

SELECT DATEADD(DAY, CONVERT(INT, 0x000B35C8), CONVERT(DATE, '0001-01-01'))

Resultado:

2012-06-11
Aaron Bertrand
fonte
Hmm, mas e a parte do tempo?
Azimute
@ Azimuth A questão era sobre o dateque não tem uma parte do tempo.
Aaron Bertrand