Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics sql analytics endpoint
in Microsoft Fabric
Warehouse in Microsoft FabricSQL Database in Microsoft Fabric SQL Database
in Microsoft Fabric
La AT TIME ZONE sentencia Transact-SQL (T-SQL) convierte un input_date en el valor correspondiente de desfasamiento de fechas en la zona horaria objetivo. Cuando input_date se proporciona sin información de desplazamiento, la función aplica el desplazamiento de la zona horaria asumiendo que input_date está en la zona horaria objetivo.
Si input_date se proporciona como valor de desfasamiento de fecha, entonces AT TIME ZONE la cláusula lo convierte a la zona horaria objetivo usando las reglas de conversión de zona horaria.
La AT TIME ZONE implementación se basa en un mecanismo de Windows para convertir los valores de fecha y hora entre diferentes zonas horarias.
Convenciones de sintaxis de Transact-SQL
Syntax
input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }
Arguments
input_date
Una expresión que se puede resolver en un valor smalldatetime, datetime, datetime2 o datetimeoffset.
'time_zone_value'
Nombre de la zona horaria de destino. time_zone_value es Nvarchar(128).
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: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.
También se muestra una lista de zonas horarias instaladas a través de la vista sys.time_zone_info sistema.
Para obtener más información sobre las zonas horarias para SQL Server en Linux, consulte Configuración de la zona horaria para SQL Server 2022 y versiones posteriores en Linux.
{ 'time_zone_value' | 'LOCAL' }
Nombre de la zona horaria de destino.
time_zone_value es nvarchar(128), con un valor por defecto de LOCAL.
Una lista de husos horarios instalados se muestra a través de la vista del sistema sys.time_zone_info .
Si LOCAL se especifica, entonces el valor actual predeterminado de la zona horaria de la sesión se establece al valor original de la zona, que puede ser una opción con alcance de base de datos o la instancia predeterminada.
Tipos de retorno
Devuelve el tipo de datos de datetimeoffset.
Valor devuelto
Valor datetimeoffset de la zona horaria de destino.
Remarks
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:00Cuando 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 en Microsoft Fabric, AT TIME ZONE todavía se puede usar con datetime2, como en el ejemplo siguiente.
Examples
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 AdventureWorks2025;
GO
SELECT SalesOrderID,
OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
Este es el conjunto de resultados.
SalesOrderID OrderDate OrderDate_TimeZonePST
------------ ----------------------- -------------------------------
43659 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43660 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43661 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43662 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43663 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43664 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
...
B. Convertir valores entre zonas horarias diferentes
En el ejemplo siguiente se convierten valores entre zonas horarias diferentes. Los OrderDate valores son datetime y no se almacenan con un desplazamiento, pero se sabe que son 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 AdventureWorks2025;
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;
Este es el conjunto de resultados.
SalesOrderID OrderDate OrderDate_TimeZonePST OrderDate_TimeZoneCET
------------ ----------------------- ------------------------------ -------------------------------
43659 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...
También puede realizar la sustitución en una variable local que contenga la zona horaria:
USE AdventureWorks2025;
GO
DECLARE @CustomerTimeZone AS 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;
Este es el conjunto de resultados.
SalesOrderID OrderDate OrderDate_TimeZonePST OrderDate_TimeZoneCustomer
------------ ----------------------- ------------------------------ -------------------------------
43659 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664 2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...
C. Consultar tablas temporales mediante una zona horaria concreta
El siguiente ejemplo selecciona datos de una tabla temporal usando WideWorldImporters la Hora Estándar del Pacífico.
USE WideWorldImporters;
GO
DECLARE @ASOF AS 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 CustomerID,
CustomerName,
ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ASOF;
Este es el conjunto de resultados.
CustomerID CustomerName ValidFrom
---------- ----------------------------------- ----------------------------------
1 Tailspin Toys (Head Office) 2013-01-01 00:00:00.0000000 -08:00
2 Tailspin Toys (Sylvanite, MT) 2013-01-01 00:00:00.0000000 -08:00
3 Tailspin Toys (Peeples Valley, AZ) 2013-01-01 00:00:00.0000000 -08:00
4 Tailspin Toys (Medicine Lodge, KS) 2013-01-01 00:00:00.0000000 -08:00
5 Tailspin Toys (Gasport, NY) 2013-01-01 00:00:00.0000000 -08:00
6 Tailspin Toys (Jessie, ND) 2013-01-01 00:00:00.0000000 -08:00