Почти все ответы и комментарии были тяжелыми для плюсов и легкими минусами. Вот краткий обзор всех «за» и «против» на данный момент, а также некоторые важные «против» (в # 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
Type (хотя оба преобразуются туда и обратно без специального кодирования, если значения находятся в пределах диапазона и точности целевого типа, за исключением Con # 2.1 ниже, иначе произойдет ошибка / округление).
1.4. Более высокая точность (100 наносекунд, то есть 0,000,000,1 сек. Против 3,33 миллисекунды или 0,003,33 сек.) (Хотя дополнительная точность, скорее всего, не будет использоваться, кроме как в инженерных / научных приложениях).
1,5. Когда сконфигурировано для аналогично (поскольку в 1 миллисекунде "не" (как в 3.33 миллисекундах), как утверждал Иман Абиди) точность равна DateTime
, использует меньше места (7 против 8 байтов), но затем конечно, вы потеряете прецизионное преимущество, которое, вероятно, является одним из двух (другое - диапазон наиболее часто рекламируемых, хотя, вероятно, ненужных).
- CONS:
2,1. При передаче параметра в .NET SqlCommand
необходимо указать System.Data.SqlDbType.DateTime2
, если вы можете передавать значение вне диапазона и / или точности SQL Server DateTime
, поскольку по умолчанию оно равно 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.blogspot.com/2015/08/how-to-translate-t-sql-datetime2-to.html»
Конечно, вы также можете Cast
до DateTime
fСначала (и при необходимости вернитесь к DateTime2
), но вы потеряете преимущества точности и дальности (все до 1753 года) в размере DateTime2
против DateTime
, которые являются 2 крупнейшими и также одинаковыми время наименьшее 2 наименее вероятно, что необходимо, и возникает вопрос, зачем его использовать, когда вы теряете неявные / простые преобразования в числовые с плавающей точкой (количество дней) для сложения / вычитания / «возраста» (против DateDiff
) / Avg
Выгода от Calcs, которая является большой в моем опыте.
Кстати, Avg
даты-времени является (или, по крайней мере, должно быть) важным вариантом использования. а) Помимо использования в получении средней продолжительности, когда дата-время (так как общая базовая дата-время) используются для представления длительности (обычная практика), б) также полезно получить статистику в виде панели мониторинга о том, какая средняя дата- время находится в столбце даты-времени диапазона / группы строк. c) Стандартный (или, по крайней мере, должен быть стандартным) специальный запрос для мониторинга / устранения неисправностей значений в столбце, которые могут быть недействительными никогда / больше и / или могут быть устаревшими, - перечислить для каждого значения счетчик вхождений и (при наличии) Min
, Avg
и Max
отметок даты и времени, связанных с этим значением.