以下を検討してください。
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)
しかし、エンディアンのため、1966600日になります!
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
、それだけで、クライアント側が使用されています。SQL Serverはそれを無視し、バイトオーダーをオフにします。
IComparable
か?データ型の内部表現を掘り下げる必要はありません。