Исключение вне диапазона при преобразовании datetime2 в тип данных datetime

У меня есть исключение при обновлении datetime столбец в SQL Server 2008 Express:

eventinfo.StartDateTime = DateTime.ParseExact(start, 
                                              "MM/dd/yyyy hh:mm tt", 
                                              CultureInfo.InvariantCulture);
db.Entry(eventinfo).State = EntityState.Modified;
db.SaveChanges();

Исключение:

Преобразование типа данных datetime2 в тип данных datetime привело к значению, выходящему за пределы допустимого диапазона. Оператор был прерван.

Есть идеи, как избежать этого исключения?

1 ответ

Решение

Домен типов данных Sql Server даты / времени выглядит следующим образом:

  • datetime2 (Точность 100 наносекунд) 1753-01-01T00:00:00.0 - 9999-12-31T23:59:59.9999999.
  • datetime (с точностью до миллисекунды... вроде) 1753-01-01T00:00:00.000 - 9999-12-31T23: 59: 59.997
  • smalldatetime (С точностью до 1 секунды) 1900-01-01T00:00:00 - 2079-06-06T23:59:59

CLR DateTime struct также имеет точность 100 наносекунд. Это отсчет 100-секундных тиков с его эпохи (0001-01-01T00:00:00). Его домен 0001-01-01T00: 00: 00 - 9999-12-31T23:59:59.9999999.

Вы заметите расширенный домен CLR DateTime по сравнению с SQL Server datetime2,

Значение по умолчанию для CLR DateTime это его эпоха (0001-01-01T00:00:00). Любое значение до 1753-01-01T00: 00: 00 вызовет исключение вне диапазона.

По всей вероятности, ваш DateTime значение почему-то не инициализируется, или DateTime.ParseExact() получает передаваемые ненужные данные, успешно анализирует их и сворачивает с датой / временем до 1753-01-01.

Другие вопросы по тегам