SQLDenisが説明するように、SQL ServerはDATETIME内部的に2つのINT値として格納します。
DATEタイプ(SQL Server 2008+)が単一 として格納されることは(論理的な拡張により)正しいINTですか?
SQLDenisが説明するように、SQL ServerはDATETIME内部的に2つのINT値として格納します。
DATEタイプ(SQL Server 2008+)が単一 として格納されることは(論理的な拡張により)正しいINTですか?
回答:
面白くするために、ページの内容を見てみましょう。
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);
部分的な結果(システムによって少し異なります):
----
13
PagePID iam_chain_type PageType
------- -------------- --------
229 In-row data 10
228 In-row data 1
それでは、228ページを見てみましょう。
DBCC TRACEON(3604, -1);
DBCC PAGE(13, 1, 228, 3);
部分的な結果。dの値が3バイトを占めていることがわかります。行のメモリダンプを見ると、内部ストレージコンポーネントの16進値c8350b02が表示されます。

SELECT DATEDIFF(DAY, CONVERT(DATE, '0001-01-01'), CONVERT(DATE, '2012-06-11'));
結果:
734664
そう:
SELECT CONVERT(VARBINARY(8), 734664);
結果:
0x000B35C8
(ページの内容と驚くほど似ていますが、ビットが逆の順序で反転していますか?)
次に:
SELECT DATEADD(DAY, CONVERT(INT, 0x000B35C8), CONVERT(DATE, '0001-01-01'))
結果:
2012-06-11
date、時間の部分がないものについてでした。