Когда я сохраняю свойство date со значением DateTime.MaxValue в базе данных и возвращаю его обратно, сохраненное значение не равно DateTime.MaxValue. Свойства тика отключены. Почему это?
Использование MS SQL, тип данных для поля даты - 'datetime'
Когда я сохраняю свойство date со значением DateTime.MaxValue в базе данных и возвращаю его обратно, сохраненное значение не равно DateTime.MaxValue. Свойства тика отключены. Почему это?
Использование MS SQL, тип данных для поля даты - 'datetime'
Поскольку время 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-наносекундные единицы, называемые клещами.
Это вполне может быть причиной того, что .NET DateTime напрямую не преобразуется в тип SQL DateTime.
Я бы установил значение, а затем отметьте отметки против SqlDateTime.MaxValue
.
Я должен признать, что я не уверен в этом, но это может быть связано с точностью datetime?
Выполнение быстрого поиска здесь - статья о Точность и точность DateTime
Кроме того, возможно, существует ошибка между точностью datetime в С# vs sql?
Каким типом является поле данных, в котором вы сохраняете это значение?
Может быть, максимальное значение для .NET DateTime
превышает емкость эквивалентного типа данных в движке базы данных.
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.