2

驚いたことに出くわしました。

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()、その値を抽出するときに呼び出すと、元の値が同じ精度で取得されます。

これは私が使用するアプローチですが、まだ興味があります: datetimeSQL Server Compact の元の型がDateTimeの ToBinary/FromBinary ストレージ メカニズムを使用しなかったのはなぜですか?

編集:

Aaron Bertrand が正しく指摘しているように、SQL Compact は をサポートしていませんdatetime2。さらに、datetime2通常の SQL Server の 54 バイトではなく、6、7、または 8 バイトを使用します。ただし、私の基本的な質問はまだ残っています。

4

1 に答える 1