2016-04-03 9 views
0

DateTimeオブジェクトとが保存され、SQLサーバーからが返されたDATETIMEオブジェクトに格納されたDateTimeオブジェクトを比較するコードがあるとします。SQL DATETIMEルールを使用する丸め日付時間

比較はhh:mm:ss-equalityで行われますが、SQL Serverは保存時に2番目のコンポーネントを '変更'するため、1.5/1000時間程度の比較が失敗する可能性があります。

DATETIME値としてデータベースに保存されたSQL Serverのwill round/truncate this valueためです:

datetime値は0.000、0.003、または0.007秒の単位に四捨五入されている。..

同じ丸め処理を行う(標準)C#/ .NET関数がありますか?

この質問の主な目的は、比較のために値より先に標準化して保存することです。つまり、F(original) == F(saved)は常に真でなければなりません。

最終的な目標は、値がhh:mm:01.999がhh:mm:01.997として格納されるように、「正しい秒数」内に確実に保存することです。これにより、元のDateTime値または復元された値に関係なく、hh:mm:ss-equalityの比較が信頼できるものになります。この場合、original.Second == F(original).Secondも常に真でなければなりません。

より良くまたはより悪いことに、1つの広く使用されている仮定は、hh:mm:ssごとに比較が行われるため、2ミリ秒の単純なイプシロン比較が出力されます。最終的な目標を解決する可能性のある比較関数について強く主張することには反対しません。

答えて

2

SqlDateTime structureは、SQL Serverのdatetimeタイプと同じ方法で日付/時刻の値を格納します。これは、.NET DateTimeタイプとの変換を提供し、変換が実行されると丸められます。

ご質問に矛盾する要件があることにご注意ください。 SQL Serverと同じ丸めが必要だと言います。また、丸めによって「二番目」のコンポーネントが決して変更されないようにしたいとします。あなたはそれを両方向に持つことはできません。 「2番目の」コンポーネントが変更されないようにする必要がある場合は、それを実装する必要があります。変換が完了した後で、第2の変更が行われたかどうかを確認してから復元することができます。

+0

@ user2864740ちょっと、それに対処するために編集しました。 :) – hvd

+0

ええ〜私はオプションを感じています。今、私はSQLのラウンド・ツー・フィックス・ソー・ツー・イット・オン・ラウンドに傾いています。これにより.9985 +の値は.997になります(最初は.0に丸められた後になります)が、コードが同じ秒を「保つ」こともできます。 – user2864740

+0

時間の値が均等に分散されることになっている場合、 '.997'ミリ秒の値がそうでなければならない可能性が高くなる統計的異常が発生することを意味します。それはおそらく問題ではありませんが、あなたはそれに気づくべきです。 – hvd

関連する問題