Hãy xem xét những điều sau đây:
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
Đầu ra:
dt dt2 d
------------------ -------------------- --------
0x0000A13900000000 0x07000000000094360B 0x94360B
Bây giờ, tôi đã hiểu từ các tài liệu mà datetime
có một phạm vi nhỏ hơn, và bắt đầu từ 1753/01/01, trong khi datetime2
và date
sử dụng 0001-01-01 như ngày bắt đầu của họ.
Mặc dù vậy, điều tôi không hiểu là datetime
dường như là người cuối datetime2
cùng và date
là người cuối cùng lớn. Nếu đó là trường hợp, làm thế nào họ thậm chí có thể được sắp xếp đúng?
Xem xét nếu tôi muốn biết có bao nhiêu ngày nguyên được biểu thị bằng một date
loại. Bạn sẽ nghĩ rằng bạn có thể làm điều này:
declare @d date
set @d = '0001-01-31'
select cast(convert(varbinary, @d) as int)
Nhưng do sự kết thúc, bạn nhận được 1966080 ngày!
Để có kết quả chính xác trong 30 ngày, bạn phải đảo ngược nó:
select cast(convert(varbinary,reverse(convert(varbinary, @d))) as int)
Hoặc, tất nhiên bạn có thể làm điều này:
select datediff(d,'0001-01-01', @d)
Nhưng điều đó có nghĩa là bên trong một nơi nào đó nó đang đảo ngược các byte.
Vậy tại sao họ chuyển đổi endianness?
Tôi chỉ quan tâm bởi vì tôi đang làm việc trên một UDT tùy chỉnh trong SQLCLR và thứ tự nhị phân của các byte dường như có vấn đề ở đó, nhưng các loại tích hợp này có vẻ linh hoạt hơn nhiều. SQL Server có nội dung nào đó trong đó mỗi loại sẽ cung cấp thuật toán sắp xếp riêng không? Và nếu vậy, có cách nào tôi có thể khai thác điều đó cho UDT tùy chỉnh của mình không?
Xem thêm, một câu hỏi liên quan (nhưng khác) trên StackOverflow.
IComparable
, nhưng nó chỉ được sử dụng phía máy khách. SQL Server bỏ qua nó và tắt thứ tự byte.
IComparable
? Bạn không cần phải đi sâu vào biểu diễn bên trong của các loại dữ liệu.