AT TIME ZONE (Transact-SQL)

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento de Microsoft Fabric

Convierte un valor inputdate en el valor datetimeoffset correspondiente en la zona horaria de destino. Si inputdate se proporciona sin información de desplazamiento, la función aplica el desplazamiento de la zona horaria, suponiendo que el valor inputdate se proporcione en la zona horaria de destino. Si inputdate se proporciona como un valor datetimeoffset, la cláusula AT TIME ZONE lo convierte en la zona horaria de destino mediante las reglas de conversión de zona horaria.

La implementación de AT TIME ZONE se basa en un mecanismo de Windows para convertir valores datetime entre zonas horarias.

Convenciones de sintaxis de Transact-SQL

Sintaxis

inputdate AT TIME ZONE timezone

Argumentos

inputdate

Una expresión que se puede resolver en un valor smalldatetime, datetime, datetime2 o datetimeoffset.

timezone

Nombre de la zona horaria de destino. SQL Server se basa en las zonas horarias almacenadas en el Registro de Windows. Las zonas horarias instaladas en el equipo se almacenan en el siguiente subárbol del Registro: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. También se puede exponer una lista de las zonas horarias instaladas a través de la vista sys.time_zone_info (Transact-SQL).

Para más información sobre las zonas horarias de SQL Server en Linux, consulte Configuración de la zona horaria para SQL Server 2022 en Linux.

Tipo de valor devuelto

Devuelve el tipo de datos de datetimeoffset.

Valor devuelto

Valor datetimeoffset de la zona horaria de destino.

Observaciones

AT TIME ZONE aplica reglas específicas para la conversión de valores de entrada en tipos de datos smalldatetime, datetime y datetime2, que se encuentran en un intervalo afectado por el cambio del horario de verano:

  • Cuando los relojes están adelantados, hay un desfase en la hora local igual a la duración del ajuste de reloj. La duración suele ser de 1 hora, pero también puede ser de 30 o 45 minutos, según la zona horaria. Los puntos en tiempo que están en este desfase se convierten con el desplazamiento después del cambio del horario de verano.

    /*
      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
    
  • Cuando el reloj se vuelve a configurar, dos horas de la hora local se superponen en una hora. En ese caso, los momentos que coinciden con el intervalo superpuesto se presentan con el desplazamiento antes del cambio del reloj:

    /*
        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
    

Puesto que parte de la información (por ejemplo, las reglas de zona horaria) se mantiene fuera de SQL Server y está sujeta a cambios ocasionales, la función AT TIME ZONE se clasifica como no determinista.

Aunque datetimeoffset no se admite en el almacenamiento de datos de Microsoft Fabric, AT TIME ZONE todavía se puede usar con datetime2, como en el ejemplo siguiente.

Ejemplos

A. Agregar un desplazamiento de zona horaria de destino a una fecha y hora sin información de desplazamiento

Use AT TIME ZONE para agregar un desplazamiento basado en reglas de zona horaria cuando sepa que los valores datetime originales se proporcionan en la misma zona horaria:

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

B. Convertir valores entre zonas horarias diferentes

En el ejemplo siguiente se convierten valores entre zonas horarias diferentes. Los valores inputdate son de tipo datetime y no se almacenan con un desplazamiento, pero se sabe que están en la hora estándar del Pacífico. El primer paso consiste en asignar el desplazamiento conocido y, luego, realizar la conversión a la nueva zona horaria:

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;

También puede realizar la sustitución en una variable local que contenga la zona horaria:

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. Consultar tablas temporales mediante una zona horaria concreta

En el ejemplo siguiente se seleccionan datos de una tabla temporal con la hora estándar del Pacífico.

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;

Pasos siguientes