了解 MS SQL Server 日期類型
考慮以下:
declare @dt datetime, @dt2 datetime2, @d date set @dt = '2013-01-01' set @dt2 = '2013-01-01' set @d = '2013-01-01' select convert(varbinary, @dt) as dt, convert(varbinary, @dt2) as dt2, convert(varbinary, @d) as d
輸出:
dt dt2 d ------------------ -------------------- -------- 0x0000A13900000000 0x07000000000094360B 0x94360B
現在,我已經從具有較小範圍的文件中了解到
datetime
,從 1753-01-01 開始,而datetime2
使用date
0001-01-01 作為開始日期。但我不明白的是,這
datetime
似乎是小端,而datetime2
大端date
。如果是這樣的話,它們怎麼能正確分類呢?
date
考慮一下我是否想知道一個類型代表了多少整數天。你會認為你可以這樣做:declare @d date set @d = '0001-01-31' select cast(convert(varbinary, @d) as int)
但是由於字節序,你得到 1966080 天!
要獲得 30 天的正確結果,您必須將其反轉:
select cast(convert(varbinary,reverse(convert(varbinary, @d))) as int)
或者,您當然可以這樣做:
select datediff(d,'0001-01-01', @d)
但這意味著在內部某個地方它無論如何都在反轉字節。
那麼他們為什麼要切換字節順序呢?
我只關心,因為我正在 SQLCLR 中處理自定義 UDT,並且字節的二進制順序在那裡似乎很重要,但這些內置類型似乎更加靈活。SQL Server 是否有內部的東西,每種類型都可以提供自己的排序算法?如果是這樣,有沒有辦法為我的自定義 UDT 使用它?
另請參閱StackOverflow 上的相關(但不同)問題。
SQL Server 不依賴於其“自己的”數據類型的二進制順序。對於 CLR 數據類型,您可以使用 iComparable 介面,但正如@MattJohnson 提到的,SQL Server 會忽略它:
Microsoft 不會發布有關如何儲存和使用不同數據類型的詳細資訊。但是,聯機叢書明確指出,您不能依賴特定數據類型的特定二進制格式,並且它們使用的格式可能隨時更改。因此,最好將 INT 儲存為 INT 而不是 VARBINARY,因為在下一個 SP 之後您可能無法再讀取數據。
至於排序:大部分 SQL Server 核心都是用 C++ 編寫的。我假設在內部使用了類似於 iComparable 的方法。但同樣,沒有關於這方面的公開可訪問的文件。即使是這樣,由於 .NET 和 C++ 之間的固有差異,您也可能無法利用它。