驚いたことに出くわしました。
WinPcap
ネットワークからデータを収集するために使用しています。内部的にWinPcap
、Windows パフォーマンス カウンターを使用してタイムスタンプを生成します。それらがドリフトしやすいことはわかっていますが、それでもこれらのタイムスタンプの精度はマイクロ秒レベルまで下がっています。
これらのタイムスタンプを値として SQL Server Compact 4.0 データベースに挿入し、datetime
後で抽出すると、精度がミリ秒に低下していることに気付きました。
例えば、
10:52:19.706084 -> 10:52:19.706000
ここで、SQL Server がdatetime
型の値を .000、.003、または .007 ミリ秒に丸めるということを読んだことがあります。それは何が起こっているのかを説明しています。
現在、datetime
フィールドはデータを格納するために 8 バイトを使用します。日付には 4 バイト、午前 0 時からのミリ秒には 4 バイトが使用されます。しかし、 を呼び出すとDateTime.ToBinary()
、すべての精度で値を表す 8 バイトの数値が返されます。実際、この値をデータベースのbigint
列に書き込みDateTime.FromBinary()
、その値を抽出するときに呼び出すと、元の値が同じ精度で取得されます。
これは私が使用するアプローチですが、まだ興味があります: datetime
SQL Server Compact の元の型がDateTime
の ToBinary/FromBinary ストレージ メカニズムを使用しなかったのはなぜですか?
編集:
Aaron Bertrand が正しく指摘しているように、SQL Compact は をサポートしていませんdatetime2
。さらに、datetime2
通常の SQL Server の 54 バイトではなく、6、7、または 8 バイトを使用します。ただし、私の基本的な質問はまだ残っています。