AT TIME ZONE (Transact-SQL)
Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL Azure Synapse Analytics в хранилище Microsoft Fabric в Microsoft Fabric
Преобразует аргумент inputdate в соответствующее значение datetimeoffset в целевом часовом поясе. Если аргумент inputdate предоставляется без сведений о смещении, функция применяет смещение часового пояса, предполагая, что inputdate находится в целевом часовом поясе. Если входное значение предоставляется в качестве значения datetimeoffset , AT TIME ZONE
предложение преобразует его в целевой часовой пояс с помощью правил преобразования часовых поясов.
AT TIME ZONE
реализация использует механизм Windows для преобразования значений даты и времени в часовых поясах.
Соглашения о синтаксисе Transact-SQL
Синтаксис
inputdate AT TIME ZONE timezone
Аргументы
inputdate
Выражение, которое можно разрешить в значение smalldatetime, datetime, datetime2 или datetimeoffset.
timezone
Имя целевого часового пояса. SQL Server использует часовые пояса, хранящиеся в реестре Windows. Часовые пояса, установленные на компьютере, хранятся в следующем кусте реестра: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Список установленных часовых поясов также предоставляется через представление sys.time_zone_info .
Дополнительные сведения о часовых поясах для SQL Server на Linux см. в разделе "Настройка часового пояса для SQL Server 2022 в Linux".
Типы возвращаемых данных
Возвращает тип данных datetimeoffset.
Возвращаемое значение
Значение datetimeoffset в целевом часовом поясе.
Замечания
AT TIME ZONE
Применяет определенные правила для преобразования входных значений в типах данных smalldatetime, datetime и datetime2, которые попадают в интервал, затронутый изменением DST:
Если часы переводятся вперед, возникает разница с местным временем, равная интервалу перевода. Интервал обычно составляет 1 час, но в некоторых часовых поясах это может быть 30–45 минут. Точки во времени, попадающие в указанный период, преобразуются со смещением после перехода на летнее время.
/* Moving to DST in "Central European Standard Time" zone: offset changes from +01:00 -> +02:00 Change occurred on March 27th, 2022 at 02:00:00. Adjusted local time became 2022-03-27 03:00:00. */ --Time before DST change has standard time offset (+01:00) SELECT CONVERT(DATETIME2(0), '2022-03-27T01:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-03-27 01:01:00 +01:00 /* Adjusted time from the "gap interval" (between 02:00 and 03:00) is moved 1 hour ahead and presented with the summer time offset (after the DST change) */ SELECT CONVERT(DATETIME2(0), '2022-03-27T02:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-03-27 03:01:00 +02:00 --Time after 03:00 is presented with the summer time offset (+02:00) SELECT CONVERT(DATETIME2(0), '2022-03-27T03:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-03-27 03:01:00 +02:00
Если время переводится назад, 2 часа местного времени перекрываются на один час. В этом случае точки во времени, входящие в перекрывающийся интервал, представляются со смещением после изменения времени.
/* Moving back from DST to standard time in "Central European Standard Time" zone: offset changes from +02:00 -> +01:00. Change occurred on October 30th, 2022 at 03:00:00. Adjusted local time became 2022-10-30 02:00:00 */ --Time before the change has DST offset (+02:00) SELECT CONVERT(DATETIME2(0), '2022-10-30T01:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-10-30 01:01:00 +02:00 /* Time from the "overlapped interval" is presented with DST offset (before the change) */ SELECT CONVERT(DATETIME2(0), '2022-10-30T02:00:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-10-30 02:00:00 +02:00 --Time after 03:00 is regularly presented with the standard time offset (+01:00) SELECT CONVERT(DATETIME2(0), '2022-10-30T03:01:00', 126) AT TIME ZONE 'Central European Standard Time'; --Result: 2022-10-30 03:01:00 +01:00
Так как некоторые сведения (например, правила часового пояса) поддерживаются за пределами SQL Server и подвергаются случайным изменениям, AT TIME ZONE
функция классируется как недетерминированная.
Хотя datetimeoffset не поддерживается в хранилище данных в Microsoft Fabric, AT TIME ZONE
можно по-прежнему использовать с datetime2, как показано в следующем примере.
Примеры
А. Добавление смещения часового пояса к datetime без сведений о смещении
Используйте AT TIME ZONE
для добавления смещения на основе правил часового пояса, когда вы знаете, что исходные значения даты и времени предоставляются в одном часовом поясе:
USE AdventureWorks2022;
GO
SELECT SalesOrderID, OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
B. Преобразование значений между разными часовыми поясами
В следующем примере выполняется преобразование значений из одного часового пояса в другой. Значения OrderDate
— datetime и не хранятся со смещением, но известны как тихоокеанское стандартное время. В первую очередь необходимо назначить известное смещение и выполнить преобразование в новый часовой пояс:
USE AdventureWorks2022;
GO
SELECT SalesOrderID, OrderDate,
--Assign the known offset only
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
--Assign the known offset, then convert to another time zone
OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE 'Central European Standard Time' AS OrderDate_TimeZoneCET
FROM Sales.SalesOrderHeader;
Вы также можете заменить локальную переменную, содержащую часовой пояс:
USE AdventureWorks2022;
GO
DECLARE @CustomerTimeZone nvarchar(128) = 'Central European Standard Time';
SELECT SalesOrderID, OrderDate,
--Assign the known offset only
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
--Assign the known offset, then convert to another time zone
OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE @CustomerTimeZone AS OrderDate_TimeZoneCustomer
FROM Sales.SalesOrderHeader;
C. Запрос темпоральных таблиц с помощью определенного часового пояса
В приведенном ниже примере показан выбор данных из темпоральной таблицы по тихоокеанскому времени США (зима).
USE AdventureWorks2022;
GO
DECLARE @ASOF DATETIMEOFFSET;
SET @ASOF = DATEADD(MONTH, -1, GETDATE()) AT TIME ZONE 'UTC';
-- Query state of the table a month ago projecting period
-- columns as Pacific Standard Time
SELECT BusinessEntityID,
PersonType,
NameStyle,
Title,
FirstName,
MiddleName,
ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM Person.Person_Temporal
FOR SYSTEM_TIME AS OF @ASOF;