考虑以下:
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年1月1日,而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的一个相关(但不同)问题。
IComparable
?您永远不需要深入研究数据类型的内部表示。