максимальное значение .net DateTime отличается, когда оно сохраняется в базе данных

#c# #.net #sql #datetime

#c# #.net #sql #datetime

Вопрос:

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

При использовании MS SQL тип данных для поля даты — ‘datetime’

введите описание изображения здесь

Комментарии:

1. Какую базу данных вы используете и какой тип данных в базе данных хранит дату?

2. Вы пробовали datetime2? technet.microsoft.com/en-us/library/bb677335.aspx

3. 1 за хороший вопрос. Я также заметил, что если вы используете DateTime. Максимальное значение в запросе Linq2SQL значение даты будет переведено в SQL за вычетом 3 миллисекунд, как объяснено в ответе… это означает, что вам даже не нужно сохранять значение в базе данных, чтобы получить это несоответствие. Кроме того, если вы используете DateTime.MinValue в запросе Linq2SQL, вы получите SQLException, указывающее, что дата Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM по той же причине.

Ответ №1:

Потому что SQL datetime имеет более низкое разрешение.

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

Источник

Введите значение DateTime .Net представляет даты и время с 12:00:00 полуночи 1 января 0001 года нашей эры до 11:59:59 вечера 31 декабря 9999 года н.э. (н.э.) Значения времени измеряются в единицах измерения 100 наносекунд, называемых тиками.

Источник

Комментарии:

1. FWIW — мне сказали, что это будет исправлено в SQL Server 2010 (или как там они его выпустят), чтобы типы данных DateTime совпадали.

2. @dolphy, в определенной степени они уже «исправили» это в SQL 2008 — у него новые типы данных даты и времени, которые обеспечат большую (или меньшую) точность. Я очень сомневаюсь, что MS когда-либо изменит то, как работают «старые» типы данных datetime, поскольку это нарушило бы чертовски много существующего кода и разозлило бы большую часть их существующей клиентской базы.

3. @Philip Kelley — это именно то, что я имел в виду. Я не понимал, что это было сделано в SQL 2008. Я думаю, это показывает, что моя компания все еще работает на SQL 2005 🙂

Ответ №2:

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

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

Ответ №3:

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

Выполнив быстрый поиск, вот статья о точности определения даты и времени

Также, возможно, существует несоответствие между точностью datetime в c # и sql?

Ответ №4:

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

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

Ответ №5:

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

 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.Максимальное значение сохраняется в SQL.