Открыть сервис

Тип данных DATETIME2

DATETIME2 — это тип данных для хранения даты и времени в системах управления базами данных (СУБД), в первую очередь в Microsoft SQL Server. Он является эволюционным развитием типа DATETIME и предназначен для обеспечения бо́льшей точности, расширенного диапазона дат и меньшего объёма занимаемой памяти.

Общая характеристика

Тип DATETIME2 был введён в Microsoft SQL Server 2008 года (версия 10.0). Он позволяет хранить значения от 0001-01-01 по 9999-12-31 (по григорианскому календарю) с точностью до 100 наносекунд. В отличие от устаревшего типа DATETIME (который имеет точность около 3,33 миллисекунды и диапазон только с 1753 года), DATETIME2 не зависит от календарной системы, используемой в SQL Server (например, для юлианского календаря). Размер хранимого значения зависит от указанной точности: от 6 байт (при точности меньше 100 наносекунд) до 8 байт (при максимальной точности). Для сравнения, старый тип DATETIME всегда занимает 8 байт, независимо от точности.

Синтаксис и параметр точности

В SQL Server тип данных объявляется как DATETIME2[(fractional seconds precision)], где fractional seconds precision — это число от 0 до 7, определяющее количество знаков после запятой для секунд. Значение по умолчанию — 7 (100 наносекунд). Например:

Чем меньше число, тем меньше объём памяти: таблица соответствия:

Это свойство позволяет оптимизировать хранение, если высокая точность не требуется.

Формат представления

Значение DATETIME2 хранится в виде двух целых чисел: количество дней от базовой даты (0001-01-01) и количество единиц времени (100-наносекундных тактов) после полуночи. При выводе (например, в SSMS) обычно отображается в строковом формате YYYY-MM-DD hh:mm:ss[.fffffff]. Однако стоит отметить, что на уровне данных нет фиксированного формата — интерпретация зависит от клиентского приложения. Стандартный литерал для вставки: '2025-01-15 14:30:00.1234567'.

Сравнение с другими типами даты и времени

DATETIME (устаревший)

SMALLDATETIME

TIME

DATE

DATETIMEOFFSET

Для большинства задач, где требуется и дата, и время с высокой точностью, но не нужна информация о часовом поясе, DATETIME2 является оптимальным выбором.

Производительность и индексы

DATETIME2 поддерживает все стандартные операции сравнения, сортировки и арифметики (например, DATEDIFF, DATEADD). Благодаря компактному представлению, операции с ним часто выполняются быстрее, чем с DATETIME, особенно при наличии индексов. Индексы по столбцам типа DATETIME2 могут быть кластеризованными и некластеризованными. Однако стоит учитывать, что при сохранении значения с дробными долями секунды (например, 1234567 для 7-й точности) эти доли участвуют в сортировке, что может влиять на порядок строк.

Поддержка временных таблиц и темпоральных таблиц

В SQL Server 2016 (версия 13.0) была введена поддержка системно-версионируемых темпоральных таблиц (Temporal Tables). Для столбцов периода (period columns) обязательно используются типы DATETIME2 (или DATETIMEOFFSET). Это связано с тем, что для корректной работы темпоральных таблиц требуется высокая точность (обычно 7 знаков) и расширенный диапазон. Темпоральные таблицы автоматически записывают время начала и окончания действия каждой версии строки, и здесь небольшая погрешность в 100 нс является допустимым компромиссом.

Работа из прикладных языков

При передаче значений DATETIME2 через драйверы баз данных (например, ODBC, JDBC, ADO.NET) необходимо учитывать точность. Многие языки программирования (C#, Java, Python) имеют собственные типы с дробными секундами (например, datetime2 в .NET). При сериализации в JSON или XML часто требуется явное указание формата. Например, в REST API на .NET Core по умолчанию используется формат ISO 8601: 2025-01-15T14:30:00.1234567. Однако старые библиотеки могут усекать дробные доли секунды до 3 знаков.

Преимущества и недостатки

Преимущества:

Недостатки:

Практические рекомендации

Для новых проектов на Microsoft SQL Server рекомендуется использовать DATETIME2 вместо DATETIME, если не требуется совместимость с очень старым кодом. При работе с временными рядами, журналами аудита, финансовыми транзакциями (где критична миллисекундная точность) стоит выбирать DATETIME2(3) (миллисекунды) или DATETIME2(7) (наносекунды). Для задач, где дата и время берутся с точностью до минуты (например, расписание встреч), можно использовать DATETIME2(0) для экономии памяти (6 байт вместо 8).

В других СУБД аналогичные типы могут называться по-другому. Например, в PostgreSQL это TIMESTAMP (без часового пояса), в OracleTIMESTAMP(9), в MySQL — DATETIME(6). Все они близки по функциональности, но имеют свои особенности работы с дробными секундами и диапазонами.

Известные проблемы

Будущее

С появлением более современных типов данных (например, TIME, DATE, DATETIMEOFFSET) и развитием облачных баз данных (Azure SQL Database) DATETIME2 остаётся стандартным выбором для большинства OLTP-приложений. Компания Microsoft не анонсировала планов по замене этого типа в ближайшей перспективе, однако рекомендуется отслеживать новые версии SQL Server для возможных оптимизаций хранения и производительности.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →