Apakah nilai tanggal SQL Server disimpan sebagai int tunggal?

8

SQL Server menyimpan secara DATETIMEinternal sebagai dua INTnilai, seperti yang dijelaskan SQLDenis .

Apakah benar (dengan ekstensi logis) bahwa DATEtipe (SQL Server 2008+) disimpan sebagai tunggal INT ?

Matius
sumber

Jawaban:

11

Hanya untuk bersenang-senang, mari kita lihat apa yang ada di halaman.

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

Hasil sebagian (akan sedikit berbeda pada sistem Anda):

----
13

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

Jadi mari kita lihat halaman 228:

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

Hasil parsial. Kita melihat bahwa nilai untuk d menempati 3 byte. Jika kita melihat dump memori untuk baris, kita melihat nilai hex untuk komponen penyimpanan internal: c8350b02- apa itu?

masukkan deskripsi gambar di sini

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

Hasil:

734664

Begitu:

SELECT CONVERT(VARBINARY(8), 734664);

Hasil:

0x000B35C8

(Terlihat sangat mirip dengan apa yang ada di halaman, hanya dengan bit dibalik dalam urutan yang berlawanan?)

Kemudian:

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

Hasil:

2012-06-11
Aaron Bertrand
sumber
Hmm tapi bagaimana dengan bagian waktunya?
Azimuth
@ Azzimuth Pertanyaannya adalah tentang dateyang tidak memiliki bagian waktu.
Aaron Bertrand