SQL Server lưu trữ DATETIMEbên trong dưới dạng hai INTgiá trị, như SQLDenis giải thích .
Là nó đúng (bằng cách mở rộng logic) mà DATEloại (SQL Server 2008+) được lưu trữ như một đơn INT ?
SQL Server lưu trữ DATETIMEbên trong dưới dạng hai INTgiá trị, như SQLDenis giải thích .
Là nó đúng (bằng cách mở rộng logic) mà DATEloại (SQL Server 2008+) được lưu trữ như một đơn INT ?
Câu trả lời:
Chỉ để cho vui, hãy xem những gì trên trang.
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);
Kết quả một phần (sẽ khác nhau trên hệ thống của bạn một chút):
----
13
PagePID iam_chain_type PageType
------- -------------- --------
229 In-row data 10
228 In-row data 1
Vì vậy, hãy nhìn vào trang 228:
DBCC TRACEON(3604, -1);
DBCC PAGE(13, 1, 228, 3);
Kết quả một phần. Chúng ta thấy rằng giá trị cho d chiếm 3 byte. Nếu chúng ta nhìn vào kết xuất bộ nhớ cho hàng, chúng ta sẽ thấy giá trị hex cho thành phần lưu trữ nội bộ: c8350b02- đó có thể là gì?

SELECT DATEDIFF(DAY, CONVERT(DATE, '0001-01-01'), CONVERT(DATE, '2012-06-11'));
Kết quả:
734664
Vì thế:
SELECT CONVERT(VARBINARY(8), 734664);
Kết quả:
0x000B35C8
(Trông tương tự như những gì trên trang, chỉ với các bit được lật theo thứ tự ngược lại?)
Sau đó:
SELECT DATEADD(DAY, CONVERT(INT, 0x000B35C8), CONVERT(DATE, '0001-01-01'))
Kết quả:
2012-06-11
datekhông có phần thời gian.