Werden die Datumswerte von SQL Server als einzelne int gespeichert?

8

SQL Server speichert DATETIMEintern als zwei INTWerte, wie SQLDenis erklärt .

Ist es richtig (durch logische Erweiterung), dass DATETypen (SQL Server 2008+) als einzelne gespeichert werden INT?

Matthew
quelle

Antworten:

11

Mal sehen, was auf der Seite steht.

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

Teilergebnisse (unterscheiden sich auf Ihrem System geringfügig):

----
13

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

Schauen wir uns also Seite 228 an:

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

Teilergebnisse. Wir sehen, dass der Wert für d 3 Bytes belegt. Wenn wir uns den Speicherauszug für die Zeile ansehen, sehen wir einen Hex-Wert für die interne Speicherkomponente: c8350b02- Was könnte das sein?

Geben Sie hier die Bildbeschreibung ein

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

Ergebnis:

734664

Damit:

SELECT CONVERT(VARBINARY(8), 734664);

Ergebnis:

0x000B35C8

(Sieht erstaunlich ähnlich aus wie auf der Seite, nur mit Bits in umgekehrter Reihenfolge?)

Dann:

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

Ergebnis:

2012-06-11
Aaron Bertrand
quelle
Hmm aber was ist mit dem Zeitteil?
Azimuth
@ Azimuth Die Frage war, datewelche keinen Zeitteil hat .
Aaron Bertrand