¿Los valores de fecha de SQL Server se almacenan como un solo int?

8

SQL Server almacena DATETIMEinternamente como dos INTvalores, como explica SQLDenis .

¿Es correcto (por extensión lógica) que los DATEtipos (SQL Server 2008+) se almacenan como un solo INT ?

Mateo
fuente

Respuestas:

11

Solo por diversión, veamos qué hay en la 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 parciales (diferirán un poco en su sistema):

----
13

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

Así que echemos un vistazo a la página 228:

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

Resultados parciales Vemos que el valor de d ocupa 3 bytes. Si observamos el volcado de memoria de la fila, vemos un valor hexadecimal para el componente de almacenamiento interno: c8350b02¿qué podría ser?

ingrese la descripción de la imagen aquí

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

Resultado:

734664

Entonces:

SELECT CONVERT(VARBINARY(8), 734664);

Resultado:

0x000B35C8

(Se ve increíblemente similar a lo que hay en la página, ¿solo con los bits invertidos en el orden opuesto?)

Entonces:

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

Resultado:

2012-06-11
Aaron Bertrand
fuente
Hmm, pero ¿qué pasa con la parte del tiempo?
Azimuth
@Azimuth La pregunta era sobre datecuál no tiene una parte de tiempo.
Aaron Bertrand