Sql-Server

了解 MS SQL Server 日期類型

  • September 13, 2016

考慮以下:

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使用date0001-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 會忽略它:

http://connect.microsoft.com/SQLServer/feedback/details/252230/sqlclr-provide-the-ability-to-use-icomparable-or-a-similar-mechanism-for-udts


Microsoft 不會發布有關如何儲存和使用不同數據類型的詳細資訊。但是,聯機叢書明確指出,您不能依賴特定數據類型的特定二進制格式,並且它們使用的格式可能隨時更改。因此,最好將 INT 儲存為 INT 而不是 VARBINARY,因為在下一個 SP 之後您可能無法再讀取數據。

至於排序:大部分 SQL Server 核心都是用 C++ 編寫的。我假設在內部使用了類似於 iComparable 的方法。但同樣,沒有關於這方面的公開可訪問的文件。即使是這樣,由於 .NET 和 C++ 之間的固有差異,您也可能無法利用它。

引用自:https://dba.stackexchange.com/questions/47115