Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2016 (13.x) e versões
posteriores Base de Dados SQL do Azure
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint in Microsoft Fabric
Warehouse em Microsoft Fabric
SQL database in Microsoft Fabric
A AT TIME ZONE instrução Transact-SQL (T-SQL) converte um input_date para o valor correspondente de datatimeoffset no fuso horário alvo. Quando input_date é fornecido sem informação de deslocamento, a função aplica o deslocamento do fuso horário, assumindo que input_date está no fuso horário alvo.
Se input_date for fornecida como valor de deslocamento de datatempo , então AT TIME ZONE a cláusula converte-a para o fuso horário alvo usando as regras de conversão de fuso horário.
A AT TIME ZONE implementação baseia-se num mecanismo do Windows para converter valores de data-hora entre fusos horários.
Transact-SQL convenções de sintaxe
Syntax
input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }
Arguments
input_date
Uma expressão que pode ser resolvida para um valor smalldatetime, datetime, datetime2 ou datetimeoffset.
'time_zone_value'
Nome do fuso horário de destino. time_zone_value é Nvarchar(128).
O SQL Server depende de fusos horários armazenados no Registro do Windows. Os fusos horários instalados no computador são armazenados na seguinte seção do Registro: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.
Uma lista dos fusos horários instalados também é exposta através da vista sys.time_zone_info sistema.
Para obter mais informações sobre fusos horários para o SQL Server no Linux, consulte Configurar o fuso horário para o SQL Server 2022 e versões posteriores no Linux.
{ 'time_zone_value' | 'LOCAL' }
Nome do fuso horário de destino.
time_zone_value é nvarchar(128), com um padrão de LOCAL.
Uma lista dos fusos horários instalados é exibida através da vista sys.time_zone_info sistema.
Se LOCAL for especificado, então o valor do fuso horário predefinido atual da sessão é definido para o valor original do fuso horário da sessão, que pode ser opção com âmbito de base de dados ou o padrão da instância.
Tipos de devolução
Retorna o tipo de dados datetimeoffset.
Valor de retorno
O valor datetimeoffset no fuso horário de destino.
Remarks
AT TIME ZONE aplica regras específicas para converter valores de entrada em tipos de dados smalldatetime, datetime e datetime2 que se enquadram em um intervalo afetado por uma alteração de horário de verão:
Quando o relógio está adiantado, há uma diferença na hora local igual à duração do ajuste do relógio. Esta duração é geralmente de 1 hora, mas pode ser de 30 ou 45 minutos, dependendo do fuso horário. Os pontos no tempo que estão nessa lacuna são convertidos com o deslocamento após a alteração do horário de verão.
/* 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:00Quando o relógio é atrasado, então 2 horas de hora local são sobrepostas em uma hora. Nesse caso, os pontos no tempo que pertencem ao intervalo sobreposto são apresentados com o deslocamento antes da mudança de relógio:
/* 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
Como algumas informações (como regras de fuso horário) são mantidas fora do SQL Server e estão sujeitas a alterações ocasionais, a AT TIME ZONE função é classificada como não determinística.
Embora o datetimeoffset não seja suportado no armazenamento de dados no Microsoft Fabric, AT TIME ZONE ainda pode ser usado com datetime2, como no exemplo a seguir.
Examples
A. Adicionar deslocamento de fuso horário de destino a datetime sem informações de deslocamento
Use AT TIME ZONE para adicionar deslocamento com base em regras de fuso horário quando souber que os valores datetime originais são fornecidos no mesmo fuso horário:
USE AdventureWorks2025;
GO
SELECT SalesOrderID,
OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
Aqui está o 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. Converter valores entre fusos horários diferentes
O exemplo a seguir converte valores entre fusos horários diferentes. Os OrderDate valores são datetime e não são armazenados com um deslocamento, mas são conhecidos por serem Pacific Standard Time. O primeiro passo é atribuir o deslocamento conhecido e, em seguida, converter para o novo fuso horário:
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;
Aqui está o 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
...
Você também pode substituir em uma variável local que contém o fuso horário:
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;
Aqui está o 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 tabelas temporais usando um fuso horário específico
O exemplo seguinte seleciona dados de uma tabela temporal usando WideWorldImporters a Hora Padrão do 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;
Aqui está o 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