2012-04-12 4 views
8

У меня есть метод, который получает свойство даты из источника (либо DataRow или SqlDataReader):Преобразование из DateTime в SqlDateTime неточна

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 
+0

Смотрите: http://stackoverflow.com/questions/7824766/how-does-sqldatetime-do-its-precision-reduction –

ответ

9

Да - SQL Server DATETIME имеет точность 3.33ms - тип данных для .NET, однако, может представлять одного миллисекунды.

Следовательно, у вас будут проблемы с округлением.

Читайте намного больше о DATETIME типа данных и его свойства и причуды здесь:

Demystifying the SQL Server DATETIME datatype

Кроме того, SQL Server 2008 введен убивание даты, связанные с новыми типами данных - читать больше о тех, кто здесь:

SQL Server 2008 New DATETIME datatypes

Эти типы делают включать DATETIME2 тип данных, который с точностью до 100 нс.

+1

Wow, быстрый и отличный ответ! Спасибо! –

3

Это документально подтвержденная точность даты использования TSQL - см. Раздел «Округление дробной второй точности» и this link from MSDN. Цитата из раздела:

значений даты и времени округлены до шагом .000, .003 или .007 секунд, как показано в следующей таблице.

.NET дата-время имеет лучшую точность.

Кроме того, MS рекомендует использовать более новые типы данных (например, datetime2, дату, время и т. Д.) Вместо даты-времени. Тип данных datetime2, представленный с Sql Server 2008, имеет схожую точность (100 нс) (такую ​​же, как и структура даты и времени .NET), а также поддерживает строковый формат ISO 8601, который позволит преобразовать дату и время .NET с даты на дату проще ((то есть, когда вы вынуждены использовать литералы вместо параметризованного запроса) и без потерь.

+0

Спасибо vinayc! Я думаю, marc_s доставил вас на почту Отличный ответ, хотя +1, и спасибо –

0

объекта SqlDateTime имеет меньшую точность, чем объект .NET DateTime, и поэтому при преобразовании в SQL он потеряет некоторую точность.

Смежные вопросы