2012-04-12 12 views
8

I持っているソースからの日付のプロパティを取得する方法(いずれかDataRowまたは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; 
} 

が、変換はそのよう少し日付を変更しているように見えます私のテストは常に失敗します。

この方法が間違って変換される理由は誰にも分かりますか? - SQL ServerのDATETIMEは3.33msの精度を持っている - .NETデータ型は、しかし、単一表すことができ

value.Value.Ticks:  634698391707468296 
sqlValue.Value.Ticks:  634698391707470000 
+0

参照:http://stackoverflow.com/questions/7824766/how-does-sqldatetime-do-its-precision-reduction –

答えて

9

はい:SqlDateTimeへの変換は、いくつかの丸めを行うように見える方法の終わりに

、ミリ秒。

したがって、時には丸めの問題が発生します。

DATETIMEデータ型とここにそのプロパティや癖について多くの続きを読む:

Demystifying the SQL Server DATETIME datatype

また、SQL Server 2008には、新しい日付関連のデータ型のスルーを導入しました - ここにそれらの詳細をお読みください。

SQL Server 2008 New DATETIME datatypes

これらのタイプは、100nsのに正確であるDATETIME2データ型が含まれません。

+1

すごく素早く優れた応答です!ありがとう! –

3

これは、TSQLの日付時刻の精度として文書化されています。「日付時刻の分数秒精度の丸め」を参照してください。this link from MSDN。セクションからの引用:次の表に示すように

日時値は、0.000、0.003、または0.007 秒単位に丸められます。

.NETの日時の精度が優れています。

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

+0

ありがとうございますvinayc!私はmarc_sが投稿であなたをピックしたと思います優れた答えは+1ですが、ありがとう –

0

SQLDATETIMEオブジェクトは、.NETのDateTimeオブジェクトよりも低い精度を持ち、およびSQLに変換するときに、それはいくつかの精度を失うことになる。

関連する問題