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.