#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.