Почти все ответы и комментарии были тяжелыми для плюсов и легкими минусами. Вот краткий обзор всех плюсов и минусов на данный момент, а также некоторые важные минусы (в # 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
штампы даты и времени , связанные с этим значением.