Который из:
это рекомендуемый способ даты и времени хранения в SQL Server 2008+?
Я знаю о различиях в точности (и, возможно, о размере места для хранения), но игнорируя их на данный момент, есть ли документ с рекомендациями о том, когда что использовать, или, может быть, нам следует использовать datetime2
только одно ?
DateTime2
(или любого другого SQL Server) Типа для этого)? См. Минусы в моем ответе 7/10/17 ниже, почему я спрашиваю.DATETIME2
имеет диапазон дат от «DATETIME
0001/01/01» до «9999/12/31 », в то время как тип поддерживает только год 1753-9999.Кроме того, если вам нужно,
DATETIME2
может быть более точным с точки зрения времени; DATETIME ограничен 3 1/3 миллисекундами, ноDATETIME2
может быть точным до 100 нс.Оба типа отображаются
System.DateTime
в .NET - никакой разницы нет.Если у вас есть выбор, я бы порекомендовал использовать по
DATETIME2
возможности. Я не вижу каких-либо преимуществDATETIME
(за исключением обратной совместимости) - у вас будет меньше проблем (с датами, выходящими за пределы допустимого диапазона и возникающими из-за этого).Плюс: если вам нужна только дата (без временной части), используйте DATE - это так же хорошо, как
DATETIME2
и экономит ваше место! :-) То же самое касается только времени - используйтеTIME
. Вот для чего существуют эти типы!источник
Nullable<DateTime>
для этого?datetime2 выигрывает в большинстве аспектов, кроме (совместимость старых приложений)
пожалуйста, обратите внимание на следующие моменты
источник изображения: MCTS Self-Paced Training Kit (экзамен 70-432): Microsoft® SQL Server® 2008 - Внедрение и обслуживание Глава 3. Таблицы -> Урок 1. Создание таблиц -> стр. 66
источник
datetime2
это здорово (Победитель)datetime2
использовать меньше места для хранения, чемdatetime
и в то же время предложить больший диапазон и более высокую точность?Я согласен с @marc_s и @Adam_Poward - DateTime2 - предпочтительный метод продвижения вперед. Он имеет более широкий диапазон дат, более высокую точность и использует одинаковое или меньшее хранилище (в зависимости от точности).
Одно обсуждение пропустили, однако ...
@Marc_s заявляет:
Both types map to System.DateTime in .NET - no difference there
. Это верно, однако обратное неверно ... и это важно при выполнении поиска в диапазоне дат (например, "найди мне все записи, измененные 5/5/2010")..NET версия
Datetime
имеет схожий диапазон и точностьDateTime2
. При сопоставлении .netDatetime
со старым SQLDateTime
происходит неявное округление . Старый SQL сDateTime
точностью до 3 миллисекунд. Это означает, что11:59:59.997
это как можно ближе к концу дня. Все, что выше, округляется до следующего дня.Попробуй это :
Избежание этого неявного округления является важной причиной для перехода на DateTime2. Неявное округление дат явно вызывает путаницу:
источник
20100505
к5/5/2010
? Прежний формат будет работать с любым регионом в SQL Server. Последний сломается:SET LANGUAGE French; SELECT Convert(datetime, '1/7/2015')
oops:2015-07-01 00:00:00.000
Почти все ответы и комментарии были тяжелыми для плюсов и легкими минусами. Вот краткий обзор всех плюсов и минусов на данный момент, а также некоторые важные минусы (в # 2 ниже), которые я видел, упоминал только один раз или не упомянул вообще.
1.1. Более совместимый с ISO (ISO 8601) (хотя я не знаю, как это проявляется на практике).
1.2. Большой диапазон (с 1/1/0001 по 12/31/9999 по сравнению с 1/1 / 1753-12 / 31/9999) (хотя дополнительный диапазон, все до 1753 года, скорее всего, не будет использоваться, кроме как, в исторических, астрономических, геологических и др. приложениях).
1.3. Точно совпадает с диапазоном диапазона .NET
DateTime
типа (хотя оба конвертируются туда и обратно без специального кодирования, если значения находятся в пределах диапазона и точности целевого типа, за исключением Con # 2.1 ниже, иначе произойдет ошибка / округление).1.4. Более высокая точность (100 наносекунд, то есть 0,000,000,1 секунды против 3,33 миллисекунды, то есть 0,003,33 секунды) (хотя дополнительная точность, скорее всего, не будет использоваться, за исключением, например, в инженерных / научных приложениях).
1,5. При настройке на аналогичную (как в 1 миллисекунде не «ту же» (как в 3.33 миллисекундах), как утверждал Иман Абиди) точность, поскольку она
DateTime
использует меньше места (7 против 8 байт), но тогда, конечно, вы потеряете прецизионная выгода, которая, вероятно, является одной из двух (другая - диапазон), которую чаще всего рекламируют, хотя, скорее всего, это и ненужные выгоды).2.1. При передаче параметра в .NET
SqlCommand
вы должны указать, можетеSystem.Data.SqlDbType.DateTime2
ли вы передавать значение за пределыDateTime
диапазона и / или точности SQL Server , поскольку по умолчанию оно равноSystem.Data.SqlDbType.DateTime
.2.2. Невозможно неявно / легко преобразовать в числовое значение с плавающей запятой (число дней с минимальной даты и времени), чтобы выполнить следующие действия в / в выражениях SQL Server с использованием числовых значений и операторов:
2.2.1. добавить или вычесть # дней или неполных дней. Примечание. Использование
DateAdd
функции в качестве обходного пути не является тривиальным, когда нужно учитывать несколько, если не все части даты-времени.2.2.2. возьмите разницу между двумя датами для расчета «возраста». Примечание.
DateDiff
Вместо этого нельзя просто использовать функцию SQL Server , поскольку она не вычисляет,age
как большинство людей ожидают в этом случае, если две даты-времени пересекают границу даты и времени календаря / часов, указанную в единицах измерения, даже если для крошечной дроби для этой единицы, она вернет разницу как 1 от этой единицы против 0. Например,DateDiff
инDay
-ы двух дат-раз с разницей всего в 1 миллисекунду вернут 1 против 0 (дней), если эти даты-времена в разные календарные дни (т.е. «1999-12-31 23: 59: 59.9999999» и «2000-01-01 00: 00: 00.0000000»). Те же самые значения даты-времени с разницей в 1 миллисекунду, если они не пересекают календарный день, возвращают значение «DateDiff» вDay
'0 (дней).2.2.3. возьмите
Avg
дату-время (в агрегированном запросе), просто преобразовав сначала «Float», а затем снова обратно вDateTime
.ПРИМЕЧАНИЕ. Для преобразования
DateTime2
в числовое значение необходимо выполнить что-то вроде следующей формулы, которая по-прежнему предполагает, что ваши значения не меньше, чем в 1970 году (что означает, что вы теряете весь дополнительный диапазон плюс еще 217 лет. Примечание. не сможет просто изменить формулу, чтобы учесть дополнительный диапазон, потому что вы можете столкнуться с проблемами переполнения чисел.25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Источник: « https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html »Конечно, вы можете также
Cast
вDateTime
первый (и при необходимости снова кDateTime2
), но вы потеряете точность и диапазон (все предшествующие года 1753) выгоды отDateTime2
VS.DateTime
которые Prolly 2 самых больших и также одновременно Prolly 2 наименее вероятно, что необходимо, и напрашивается вопрос, зачем его использовать, когда вы теряете неявные / простые преобразования в числовые с плавающей запятой (# дней) для сложения / вычитания / "возраста" (противDateDiff
) /Avg
выгоды calcs, которая является большой по моему опыту.Кстати,
Avg
дата-время является (или, по крайней мере, должно быть) важным вариантом использования. а) Помимо использования в получении средней продолжительности, когда дата-время (так как общая базовая дата-время) используются для представления длительности (обычная практика), б) также полезно получить статистику в виде панели мониторинга о том, какая средняя дата- время находится в столбце даты-времени диапазона / группы строк. c) Стандартный (или, по крайней мере, должен быть стандартным) специальный запрос для мониторинга / устранения неисправностей значений в столбце, которые могут быть недействительными никогда / больше и / или, возможно, должны быть признаны устаревшими, заключается в перечислении для каждого значения счетчика вхождений и (если таковые имеются) вMin
,Avg
иMax
штампы даты и времени , связанные с этим значением.источник
DateTime
, связаны с влиянием на запросы и операторы SQL Server.DateTime2
я уже упоминал (из-за высокой вероятности переполнения)). Число рейнольдса «не работает для большинства типов дат»: вам нужно, чтобы оно работало только с одним, и большинство дат в большинстве приложений, вероятно, никогда не потребуется преобразовывать в другой тип даты в течение всей их жизни (за исключением, может быть, как я уже упоминал ,DateTime2
чтобыDateTime
(например, сделать «арифметику по датам»; P). Учитывая это, не стоит всего дополнительного кодирования не только в запрограммированных, но и в специальных исследовательских запросах использовать неарифметический дружественный тип даты.DateTime2 наносит ущерб, если вы - разработчик Access, пытающийся написать Now () для рассматриваемого поля. Просто выполнил миграцию Access -> SQL 2008 R2 и поместил все поля даты и времени в DateTime2. Добавление записи с Now () в качестве значения, полученного в результате взрыва. Это было хорошо 01.01.2012 14:53:04, но не 10.01.2012 14:53:04.
Однажды персонаж сделал разницу. Надеюсь, это кому-нибудь поможет.
источник
Вот пример, который покажет вам различия в размере хранилища (в байтах) и точности между smalldatetime, datetime, datetime2 (0) и datetime2 (7):
который возвращается
Поэтому, если я хочу сохранить информацию до секунды, но не до миллисекунды, я могу сохранить 2 байта каждый, если я использую datetime2 (0) вместо datetime или datetime2 (7).
источник
хотя с datetime2 повышена точность , некоторые клиенты не поддерживают date , time или datetime2 и вынуждают вас преобразовывать в строковый литерал. В частности, Microsoft упоминает проблемы ODBC, OLE DB, JDBC и SqlClient «нижнего уровня» с этими типами данных и имеет диаграмму, показывающую, как каждый может сопоставить тип.
Если значение совместимости выше точности, используйте datetime
источник
Старый вопрос ... Но я хочу добавить кое-что, что еще не было сказано кем-то здесь ... (Примечание: это мое собственное наблюдение, поэтому не спрашивайте никаких ссылок)
Datetime2 быстрее при использовании в критериях фильтра.
TLDR:
В SQL 2016 у меня была таблица с сотнями тысяч строк и столбцом datetime ENTRY_TIME, потому что требовалось хранить точное время до секунд. При выполнении сложного запроса со многими объединениями и подзапросом, когда я использовал выражение where как:
Первоначально запрос выполнялся нормально, когда были сотни строк, но когда количество строк увеличилось, запрос начал выдавать эту ошибку:
Я удалил предложение where, и неожиданно запрос был выполнен за 1 секунду, хотя теперь были получены ВСЕ строки для всех дат. Я запускаю внутренний запрос с предложением where, и это заняло 85 секунд, а без предложения where - 0,01 секунды.
Я сталкивался здесь со многими потоками для этой проблемы как производительность фильтрации по времени и дате
Я немного оптимизировал запрос. Но реальная скорость, которую я получил, заключалась в изменении столбца datetime на datetime2.
Теперь тот же запрос, который был ранее заблокирован, занимает менее секунды.
ура
источник
Интерпретация строк даты в
datetime
иdatetime2
может отличаться, если используютсяDATEFORMAT
настройки за пределами США . НапримерЭто возвращает
2013-05-06
(т.е. 6 мая) дляdatetime
, и2013-06-05
(т.е. 5 июня) дляdatetime2
. Однако сdateformat
set tomdy
, оба@d
и@d2
возвращаются2013-06-05
.Такое
datetime
поведение противоречит документации MSDN, вSET DATEFORMAT
которой говорится: Некоторые форматы символьных строк, например ISO 8601, интерпретируются независимо от параметра DATEFORMAT . Очевидно, не правда!Пока меня это не укусило, я всегда думал, что
yyyy-mm-dd
даты будут обрабатываться правильно, независимо от настроек языка / локали.источник
SET LANGUAGE FRENCH; DECLARE @d DATETIME = '20130605'; SELECT @d;
Попробуйте еще раз с тире.Согласно этой статье , если вы хотите иметь одинаковую точность DateTime с использованием DateTime2, вы просто должны использовать DateTime2 (3). Это должно дать вам ту же точность, занимать на один байт меньше и обеспечить расширенный диапазон.
источник
Я просто наткнулся на еще одно преимущество
DATETIME2
: он позволяет избежать ошибки вadodbapi
модуле Python , которая взрывается, еслиdatetime
передается стандартное библиотечное значение, которое имеет ненулевые микросекунды дляDATETIME
столбца, но работает нормально, если столбец определен какDATETIME2
.источник
Приведенный выше SQL не будет работать с полем DateTime2. Возвращается сообщение об ошибке «Тип операнда clash: datetime2 несовместим с int»
Добавление 1 для получения следующего дня - это то, что разработчики делали с датами в течение многих лет. Теперь у Microsoft есть супер новое поле datetime2, которое не может справиться с этой простой функциональностью.
«Давайте использовать этот новый тип, который хуже старого», я так не думаю!
источник
datetime
иdatetime2
типы данных оба были введены в SQL Server 2008. Вы также получаетеOperand type clash: date is incompatible with int
отdate
типа , который был вокруг с первым днем точки. Все три типа данных работают очень хорошо,dateadd(dd, 1, ...)
хотя.Я думаю, что
DATETIME2
это лучший способ хранитьdate
, потому что он имеет большую эффективность, чемDATETIME
. ВSQL Server 2008
вы можете использоватьDATETIME2
, он хранит дату и время, занимает 6-8bytes
для хранения и имеет точность100 nanoseconds
. Так что каждый, кто нуждается в большей точности времени, захочетDATETIME2
.источник