Форматирование даты и времени в TSQL: формат ISO 8601

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам необходимо преобразовать DATETIME в формат ISO 8601 в T-SQL, воспользуйтесь следующим выражением:

SQL
Скопировать код
SELECT FORMAT(GETDATE(), 'yyyy-MM-ddTHH:mm:ss') AS ISO8601;

Этот запрос вернет текущее время в формате "2023-03-16T14:28:23", полностью согласно стандарту ISO 8601.

Кинга Идем в IT: пошаговый план для смены профессии

Визуализация

Для более наглядного представления процесса преобразования используем эмодзи:

Markdown
Скопировать код
📅 ➡️ 🔄 ➡️ 📆
  • 📅: исходное значение DATETIME.
  • 🔄: функция CONVERT, выполняющая изменение формата.
  • 📆: результат в формате ISO 8601, готовый к использованию.

Необходимость применения 'CONVERT'

В SQL Server формат ISO 8601 чаще всего используется для представления дат и времени, иногда с указанием временной зоны:

  • Стандартный формат: YYYYMMDDTHHMMSS или YYYYMMDDTHHMMSSZ
  • Расширенный формат: YYYY-MM-DDTHH:MM:SS или YYYY-MM-DDTHH:MM:SSZ — этот формат удобнее для отображения.

Функция CONVERT — важный инструмент для любого разработчика. Чаще всего она используется со стилями 126 (без указания временной зоны) или 127 (с указанием временной зоны):

SQL
Скопировать код
SELECT CONVERT(NVARCHAR(30), GETDATE(), 126) AS ISO8601; 
-- Преобразует в расширенный формат ISO 8601

SELECT CONVERT(NVARCHAR(30), GETDATE(), 127) AS ISO8601; 
-- Возвращает результат со значением временной зоны "Zulu" (UTC+0)

Фокус на производительности

При обработке больших объемов данных важно обеспечить производительность. Хоть и функция FORMAT кажется удобной, её использование возможно только в T-SQL, начиная с версии 2012.

Для поддержания эффективности работы рекомендуется использовать функцию CONVERT со стилями 126 и 127:

SQL
Скопировать код
SELECT CONVERT(VARCHAR, GETDATE(), 127) as ISO8601; 
-- Это эффективное и элегантное решение

Правильное хранение даты и времени

Рекомендуется хранить даты в типах данных SQL Server DATETIME, применяя форматирование только для отображения данных:

SQL
Скопировать код
SELECT CONVERT(VARCHAR, your_datetime, 126) AS TimeOnly;

Хранение уже отформатированных дат не желательно, так как это снижает производительность запросов, усложняет индексацию и вычисления.

'YMD' — универсальный формат в T-SQL

При вставке дат рекомендуется использовать формат YMD, или YYYY-MM-DD, обеспечивающий безпроблемное принятие данных:

SQL
Скопировать код
INSERT INTO your_table (date_column) VALUES ('20230316');

Учет временных зон

Для избежания путаницы с временными зонами воспользуйтесь функцией DATETIMEOFFSET, которая позволяет явным образом задавать смещение временной зоны:

SQL
Скопировать код
SELECT CONVERT(VARCHAR, your_datetimeoffset, 127) AS ISO8601;

Полезные материалы

  1. FORMAT (Transact-SQL) — SQL Server | Microsoft Learn — документация по использованию форматирования дат в ISO 8601.
  2. What is the "right" JSON date format? — Stack Overflow — что такое корректный формат даты в JSON.
  3. ISO 8601 — Википедия — подробности о стандарте ISO 8601.
  4. SQL Server CONVERT() Function — как испольщовать функцию CONVERT в SQL Server.
  5. Best approach to remove time part of datetime in SQL Server — Stack Overflow — рекомендации по работе со значениями datetime в SQL Server.