Преобразование DateTimeOffset в DateTime в SQL сервере

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

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

Чтобы преобразовать DateTimeOffset в DateTime, вы можете использовать функцию CONVERT, указав формат 1 для UTC:

SQL
Скопировать код
SELECT CONVERT(DateTime, yourDateTimeOffsetColumn, 1) AS ConvertedDateTime
FROM yourTableName;

Этот код позволяет преобразовать DateTimeOffset в DateTime, при этом корректно учитывает временное смещение.

Особенности преобразований

При конвертации DateTimeOffset в DateTime важно обеспечить точность временных отметок.

Корректировка с учётом временных смещений

Не забудьте учитывать смещение времени в DateTimeOffset. Важно, чтобы преобразованное DateTime соответствовало исходному времени DateTimeOffset по UTC:

SQL
Скопировать код
-- Преобразовываем в UTC, сохраняя секунды!
SELECT SWITCHOFFSET(yourDateTimeOffsetColumn, '+00:00') AS UTCDateTimeOffset,
       CONVERT(DateTime2, SWITCHOFFSET(yourDateTimeOffsetColumn, '+00:00')) AS ConvertedDateTime
FROM yourTableName;

Функция SWITCHOFFSET приводит DateTimeOffset к UTC, после чего производится преобразование в DateTime2, обеспечивая высокую точность.

Использование AT TIME ZONE для обеспечения точности

Начиная с SQL Server 2016, можно использовать AT TIME ZONE для преобразования с учётом временной зоны:

SQL
Скопировать код
-- Словно в кинотеатре, но вместо попкорна – временные зоны!
SELECT yourDateTimeOffsetColumn AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS ConvertedDateTime
FROM yourTableName;

AT TIME ZONE обеспечивает преобразование DateTimeOffset в DateTime, соответствующий UTC.

Сохранение точности с помощью DateTime2

Рекомендуется преобразовать в DateTime2 перед переходом к DateTime для сохранения точности:

SQL
Скопировать код
-- Время ценнее, чем деньги!
SELECT CONVERT(DateTime2, yourDateTimeOffsetColumn) AS DateTime2Format
FROM yourTableName;

Используйте CONVERT со стилем 126 для сохранения максимальной точности при переводе в DateTime:

SQL
Скопировать код
-- Точность – залог правильных решений!
SELECT CONVERT(DateTime2, yourDateTimeOffsetColumn, 126) AS HighPrecisionDateTime
FROM yourTableName;

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

Преобразование DateTimeOffset в DateTime можно представить как перемещение между временными зонами:

Markdown
Скопировать код
Начальная точка DateTimeOffset (🚉) 
[2023-04-12 08:00:00 +02:00]
           |  
           | (Преобразование с учётом временных зон)
           V
Конечная точка DateTime (🏫) [2023-04-12 06:00:00]

Важно помнить: корректировка временной зоны похожа на перемещение часовой стрелки, как при прибытии поезда на конечную станцию.

Понимание различия между локальным временем и UTC

Преобразование дат и времени включает в себя множество нюансов, связанных с ними, таких как учёт локального и UTC времени.

Учёт различий в локальном времени

Для работы с локальным временем используйте GETUTCDATE(), чтобы обеспечить исполнение запросов с учётом текущего времени в UTC:

SQL
Скопировать код
-- Контролируем время!
SELECT GETUTCDATE() AS CurrentUTCTime;

Управление различиями часовых поясов сервера

Чтобы определить смещение времени сервера, можно использовать функцию DATEPART с параметром 'tz':

SQL
Скопировать код
-- Берём под контроль временное смещение
SELECT DATEPART(tz, SYSDATETIMEOFFSET()) AS ServerTimezoneOffset;

Учитывайте различия в часовых поясах сервера, чтобы исключить ошибки при преобразовании.

Проверка результатов преобразования

Тестирование преобразований должно быть максимально точным. Проверьте разные значения DateTimeOffset, учитывая летнее время и такие детали, как секунды коррекции:

SQL
Скопировать код
-- Время для экспериментов!

Автоматизируйте ваши тесты, чтобы сравнить ожидаемые и фактические результаты DateTime.

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

  1. Структура DateTimeOffset (System) | Microsoft Learn — детализированное руководство по DateTimeOffset от MSDN.
  2. Функции CAST и CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — инструкция по преобразованию типов данных, включая преобразование DateTimeOffset в DateTime.
  3. c# – DateTime vs DateTimeOffset – Stack Overflow — обсуждение различий и выбора между DateTime и DateTimeOffset.
  4. Функции CAST и CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — официальные материалы Microsoft по функциям CAST и CONVERT, включая различные стили представления даты и времени.
  5. Типы данных дат и времени и функции – SQL Server (Transact-SQL) | Microsoft Learn — обзор типов данных и функций для работы с датой и временем в SQL Server.