Подтвердить что ты не робот

.net DateTime MaxValue отличается после его сохранения в базе данных

Когда я сохраняю свойство date со значением DateTime.MaxValue в базе данных и возвращаю его обратно, сохраненное значение не равно DateTime.MaxValue. Свойства тика отключены. Почему это?

Использование MS SQL, тип данных для поля даты - 'datetime'

enter image description here

4b9b3361

Ответ 1

Поскольку время datetime SQL имеет более низкое разрешение.

Тип данных DateTime в MS SQL представляет данные даты и времени из 1 января 1753 года, до 31 декабря 9999 года, с точностью до одного три сотой секунды, или 3,33 миллисекунды. Значения округлены до приращения .000,.003 или .007 миллисекунды.

источник

Тип значения DateTime в .Net представляет даты и время от 12:00:00 полночь, 1 января 0001 года Анно Домини (общая эра) через 11:59:59 P.M., 31 декабря 9999 A.D. (C.E.) Значения времени измеряются в 100-наносекундные единицы, называемые клещами.

источник

Ответ 2

Это вполне может быть причиной того, что .NET DateTime напрямую не преобразуется в тип SQL DateTime.

Я бы установил значение, а затем отметьте отметки против SqlDateTime.MaxValue.

Ответ 3

Я должен признать, что я не уверен в этом, но это может быть связано с точностью datetime?

Выполнение быстрого поиска здесь - статья о Точность и точность DateTime

Кроме того, возможно, существует ошибка между точностью datetime в С# vs sql?

Ответ 4

Каким типом является поле данных, в котором вы сохраняете это значение?

Может быть, максимальное значение для .NET DateTime превышает емкость эквивалентного типа данных в движке базы данных.

Ответ 5

MS SQL Server делает некоторые странные вещи с датами на самом низком уровне. Например, рассмотрим следующий script:

select
    test1 = dateadd(ms,-1,convert(datetime,'20110504')),
    test2 = dateadd(ms,-2,convert(datetime,'20110504')),
    test3 = dateadd(ms,-3,convert(datetime,'20110504')),
    test4 = dateadd(ms,-4,convert(datetime,'20110504')),
    test5 = dateadd(ms,-5,convert(datetime,'20110504')),
    test6 = dateadd(ms,-6,convert(datetime,'20110504'))

Это возвращает:

test1                   test2                   test3                   test4                   test5                   test6
----------------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
2011-05-04 00:00:00.000 2011-05-03 23:59:59.997 2011-05-03 23:59:59.997 2011-05-03 23:59:59.997 2011-05-03 23:59:59.993 2011-05-03 23:59:59.993

Как вы можете видеть, MS SQL работает только с миллисекундами до ближайшего 3. Если вы идете между ними, они округляются. Возможно, что это то, что происходит, когда DateTime.MaxValue хранится в SQL.