8

ソース ( aDataRowまたは a SqlDataReader)から日付プロパティを取得するメソッドがあります。

protected SqlDateTime GetSqlDateTimePropertyValue(string propertyName, object source)
{
  var objValue = GetPropertyValue(propertyName, source);
  var value = objValue == DBNull.Value ? null : (DateTime?)objValue;
  var sqlValue = new SqlDateTime();
  if (value.HasValue) sqlValue = value.Value;
  return sqlValue;
}

しかし、変換により日付がわずかに変更されているように見えるため、テストは常に失敗します。

このメソッドが間違って変換される理由を知っている人はいますか?

メソッドの最後で、 への変換でSqlDateTime丸めが行われているように見えます。

value.Value.Ticks:        634698391707468296
sqlValue.Value.Ticks:     634698391707470000
4

3 に答える 3

9

はい - SQL ServerDATETIMEの精度は 3.33 ミリ秒ですが、.NET データ型は 1 ミリ秒を表すことができます。

したがって、丸めの問題が発生する場合があります。

DATETIMEここで、データ型とそのプロパティと癖について詳しく読んでください。

SQL Server の DATETIME データ型の謎を解く

また、SQL Server 2008 では、多数の新しい日付関連のデータ型が導入されました。詳細については、次を参照してください。

SQL Server 2008 の新しい DATETIME データ型

これらの型には、 DATETIME2100ns までの精度のデータ型が含まれています。

于 2012-04-12T04:57:34.020 に答える
3

これは、TSQL 日時の精度について文書化されています。MSDN のこのリンクにある「日時の小数秒精度の丸め」というタイトルのセクションを参照してください。セクションからの引用:

次の表に示すように、datetime 値は .000、.003、または .007 秒単位で丸められます。

.NET 日時の方が精度が高くなります。

さらに、MS は、日時の代わりに新しいデータ型 (datetime2、date、time など) を使用することをお勧めします。Sql Server 2008 で導入されたデータ型datetime2は、同様の精度 (100ns) (.NET 日付/時刻構造と同じ) を持ち、.NET 日付/時刻から SQL 日付/時刻への変換をより簡単にする ISO 8601 文字列形式もサポートしています。 ((つまり、パラメータ化されたクエリの代わりにリテラルを使用する必要がある場合)、損失はありません。

于 2012-04-12T05:00:16.950 に答える
0

SqlDateTime オブジェクトは .NET DateTime オブジェクトよりも精度が低いため、SQL に変換すると精度がいくらか失われます。

于 2012-04-12T05:03:39.947 に答える