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 ?

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

Hmm tapi bagaimana dengan bagian waktunya?
Azimuth

@ Azzimuth Pertanyaannya adalah tentang dateyang tidak memiliki bagian waktu.
Aaron Bertrand
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.