Les valeurs de date de SQL Server sont-elles stockées sous la forme d'un entier unique?


8

SQL Server stocke en DATETIMEinterne deux INTvaleurs, comme l' explique SQLDenis .

Est-il correct (par extension logique) que les DATEtypes (SQL Server 2008+) soient stockés comme un seul INT ?

Réponses:


11

Juste pour le plaisir, voyons ce qui est sur la page.

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

Résultats partiels (différeront un peu sur votre système):

----
13

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

Regardons donc la page 228:

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

Résultats partiels. Nous voyons que la valeur de d occupe 3 octets. Si nous regardons le vidage de mémoire pour la ligne, nous voyons une valeur hexadécimale pour le composant de stockage interne: c8350b02- qu'est-ce que cela pourrait être?

entrez la description de l'image ici

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

Résultat:

734664

Donc:

SELECT CONVERT(VARBINARY(8), 734664);

Résultat:

0x000B35C8

(Cela ressemble étonnamment à ce qui est sur la page, juste avec des bits inversés dans l'ordre inverse?)

Alors:

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

Résultat:

2012-06-11

Hmm mais qu'en est-il du temps?
— Azimuth

@Azimuth La question était de savoir datequi n'a pas de partie de temps.
— Aaron Bertrand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.