AT TIME ZONE (Transact-SQL)

Область применения:SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics

Преобразует аргумент inputdate в соответствующее значение datetimeoffset в целевом часовом поясе. Если аргумент inputdate предоставляется без сведений о смещении, функция применяет смещение часового пояса, предполагая, что inputdate находится в целевом часовом поясе. Если аргумент inputdate предоставляется как значение datetimeoffset, предложение AT TIME ZONE преобразует его в целевой часовой пояс с помощью правил преобразования часовых поясов.

При преобразовании значений datetime в разных часовых поясах реализация функции AT TIME ZON зависит от механизма Windows.

Topic link iconСинтаксические обозначения в 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 (Transact-SQL).

Типы возвращаемых данных

Возвращает тип данных datetimeoffset.

Возвращаемое значение

Значение datetimeoffset в целевом часовом поясе.

Remarks

AT TIME ZONE применяет специальные правила для преобразования входных значений с типами данных smalldatetime, datetime и datetime2, которые попадают в период перехода на летнее время:

  • Если часы переводятся вперед, возникает разница с местным временем, равная интервалу перевода. Интервал обычно составляет 1 час, но в некоторых часовых поясах это может быть 30–45 минут. Точки во времени, попадающие в указанный период, преобразуются со смещением после перехода на летнее время.

    /*  
        Moving to DST in "Central European Standard Time" zone: 
        offset changes from +01:00 -> +02:00   
        Change occurred on March 29th, 2015 at 02:00:00.   
        Adjusted local time became 2015-03-29 03:00:00.  
    */  
    
    --Time before DST change has standard time offset (+01:00)
    SELECT CONVERT(DATETIME2(0), '2015-03-29T01:01:00', 126)     
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 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), '2015-03-29T02:01:00', 126)   
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 03:01:00 +02:00
    
    --Time after 03:00 is presented with the summer time offset (+02:00)
    SELECT CONVERT(DATETIME2(0), '2015-03-29T03:01:00', 126)   
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 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 25th, 2015 at 03:00:00.
        Adjusted local time became 2015-10-25 02:00:00
    */  
    
    --Time before the change has DST offset (+02:00)
    SELECT CONVERT(DATETIME2(0), '2015-10-25T01:01:00', 126)
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-10-25 01:01:00 +02:00  
    
    /*
      Time from the "overlapped interval" is presented with DST offset (before the change)
    */
    SELECT CONVERT(DATETIME2(0), '2015-10-25T02:00:00', 126)
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-10-25 02:00:00 +02:00  
    
    
    --Time after 03:00 is regularly presented with the standard time offset (+01:00)
    SELECT CONVERT(DATETIME2(0), '2015-10-25T03:01:00', 126)
    AT TIME ZONE 'Central European Standard Time';
    --Result: 2015-10-25 03:01:00 +01:00
    
    

Так как некоторые сведения (например, правила часовых поясов) хранятся вне SQL Server и могут иногда меняться, функция AT TIME ZONE классифицируется как недетерминированная.

Примеры

A. Добавление смещения часового пояса к datetime без сведений о смещении

Используйте функцию AT TIME ZONE, чтобы добавить смещение на основании правил для часовых поясов, если известно, что исходные значения datetime указаны в том же часовом поясе:

USE AdventureWorks2016;
GO  
  
SELECT SalesOrderID, OrderDate,
    OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST  
FROM Sales.SalesOrderHeader;

Б. Преобразование значений между разными часовыми поясами

В следующем примере выполняется преобразование значений из одного часового пояса в другой. Значения inputdate относятся к типу DateTime и сохраняются без смещения, но известно, что они соответствуют тихоокеанскому времени (зима). В первую очередь необходимо назначить известное смещение и выполнить преобразование в новый часовой пояс:

USE AdventureWorks2016;
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 AdventureWorks2016;
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;

Дальнейшие действия