Перевод времени из UTC в локальное в SQL-запросах

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

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

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

Чтобы преобразовать datetime в UTC в локальное время в SQL, применяем оператор AT TIME ZONE:

SQL
Скопировать код
SELECT 
    UTC_Column AT TIME ZONE 'UTC' AT TIME ZONE 'your_time_zone' AS LocalTime 
FROM 
    YourTable;

Меняйте your_time_zone согласно вашему временному поясу. Первое использование AT TIME ZONE определяет, что начальное время в колонке соответствует UTC, а второе — преобразует его в выбранное вами локальное время.

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

Погружаемся в детали работы с часовыми поясами

Переключение между часовыми поясами в более ранних версиях SQL Server

В классической реализации SQL Server, предшествующей версии 2016, вы можете использовать сочетание функций DATEADD и DATEDIFF:

SQL
Скопировать код
SELECT
    DATEADD(HOUR, DATEDIFF(HOUR, GETUTCDATE(), GETDATE()), UTC_Column) AS LocalTime
FROM
    YourTable;

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

Учёт перехода на летнее время

Если регион предусматривает переход на летнее время (DST), требуется использование собственных функций:

SQL
Скопировать код
SELECT
    AdjustToDST(UTC_Column) AS LocalTime
FROM
    YourTable;

AdjustToDST – это ваша созданная функция, которая учитывает начало и конец периода DST.

SQL-CruiseControl_2016&AzureEdition

Упрощаем работу с SQL Server 2016 и Azure

В мире SQL Server 2016 и его более поздних версий, а также Azure, вам пригодится AT TIME ZONE. Не забывайте также об таблице sys.time_zone_info, содержащей перечень всех часовых поясов.

DeepCodingHeaven_CLR

Достижение новых уровней с помощью CLR

Для преобразования временных зон на самом высоком уровне используйте CLR-процедуры. Это мощный инструмент для быстрой и гибкой коррекции временных зон.

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

Представьте себя регулятором времени, когда UTC переходит в локальное время в SQL:

Markdown
Скопировать код
UTC Время:        14:00 🕑 
Перелёт времени: 🛫   (UTC) -----> (Локальное время)   🛬
Локальное время:  🕔 Настройка

В SQL функции быстро меблируют календарное колесо (⚙️).

SQL
Скопировать код
SELECT CONVERT_TZ('column_name', '+00:00', 'Your_Local_Timezone') 
AS local_time FROM your_table;

Каждая строка пропускается через временной портал и выходит уже в выбранной вами временной зоне 🌍🕒.

Часовые пояса без камуфляжа

Внимание к названиям

Будьте внимательны к нюансам в названиях, особенно актуально это для datetimeoffset, который позволяет учесть не только дату и время, но и смещение относительно UTC.

Смена времён года

Не забывайте о различиях во времени в течение года – при переходе на DST и обратно. Не беспокойтесь! С помощью DATEPART и TZOFFSET определить актуальное смещение не составит труда:

SQL
Скопировать код
SELECT 
    DATEADD(MINUTE, DATEPART(TZOFFSET, SYSDATETIMEOFFSET()), UTC_Column) AS LocalTime
FROM 
    YourTable;

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

  1. AT TIME ZONE (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация Microsoft о AT TIME ZONE в SQL Server.
  2. MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions — руководство по функции CONVERT_TZ() в MySQL.
  3. PostgreSQL Documentation: 8.5. Date/Time Types — описание типов даты и времени в PostgreSQL.
  4. Date And Time Functions — возможности работы с датой и временем в SQLite.
  5. Date – JavaScript | MDN — управление датой и временем в JavaScript.