AT TIME ZONE (Transact-SQL)
Si applica a: SQL Server 2016 (13.x) e versioni successive database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics in Microsoft Fabric Warehouse in Microsoft Fabric SQL database in Microsoft Fabric
Converte un elemento inputdate nel valore datetimeoffset corrispondente nel fuso orario di destinazione. Quando inputdate viene specificato senza informazioni relative alla differenza, la funzione applica la differenza del fuso orario presumendo che inputdate sia nel fuso orario di destinazione. Se inputdate viene fornito come valore datetimeoffset , AT TIME ZONE
la clausola lo converte nel fuso orario di destinazione usando le regole di conversione del fuso orario.
AT TIME ZONE
l'implementazione si basa su un meccanismo di Windows per convertire i valori datetime in fusi orari.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
inputdate AT TIME ZONE timezone
Argomenti
inputdate
Espressione che può essere risolta in un valore smalldatetime, datetime, datetime2 o datetimeoffset.
timezone
Nome del fuso orario di destinazione. SQL Server si basa sui fusi orari che vengono archiviati nel Registro di sistema di Windows. I fusi orari installati nel computer vengono archiviati nell'hive del Registro di sistema seguente: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
. Viene inoltre esposto un elenco di fusi orari installati tramite la visualizzazione sys.time_zone_info .
Per altre informazioni sui fusi orari per SQL Server in Linux, vedere Configurare il fuso orario per SQL Server 2022 in Linux.
Tipi restituiti
Restituisce il tipo di dati di datetimeoffset.
Valore restituito
Il valore datetimeoffset nel fuso orario di destinazione.
Osservazioni:
AT TIME ZONE
applica regole specifiche per la conversione dei valori di input in tipi di dati smalldatetime, datetime e datetime2 che rientrano in un intervallo interessato da una modifica dell'ora legale:
Quando l'orologio viene spostato in avanti, vi è uno scostamento nell'ora locale uguale alla durata della regolazione dell'orologio. Questa durata è in genere di 1 ora, ma può essere di 30 o 45 minuti, a seconda del fuso orario. I singoli momenti contenuti in questo scostamento vengono convertiti con la differenza dopo il passaggio all'ora legale.
/* 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
Quando l'ora viene riportata indietro, 2 ore dell'ora locale si sovrappongono a formarne una sola. In tal caso, i singoli momenti che appartengono all'intervallo sovrapposto vengono presentati con la differenza prima del cambio dell'ora:
/* 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
Poiché alcune informazioni, ad esempio le regole del fuso orario, vengono mantenute all'esterno di SQL Server e sono soggette a modifiche occasionali, la AT TIME ZONE
funzione viene classificato come non deterministico.
Anche se datetimeoffset non è supportato nel data warehousing in Microsoft Fabric, AT TIME ZONE
può comunque essere usato con datetime2, come nell'esempio seguente.
Esempi
R. Aggiungere la differenza di fuso orario di destinazione a datetime senza informazioni relative alla differenza
Usare AT TIME ZONE
per aggiungere offset in base alle regole del fuso orario quando si sa che i valori datetime originali vengono forniti nello stesso fuso orario:
USE AdventureWorks2022;
GO
SELECT SalesOrderID, OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
B. Convertire i valori tra fusi orari diversi
Nell'esempio seguente vengono convertiti valori tra fusi orari diversi. I OrderDate
valori sono datetime e non vengono archiviati con un offset, ma sono noti come Pacific Standard Time. Il primo passaggio consiste nell'assegnare l'offset noto e quindi eseguire la conversione nel nuovo fuso orario:
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;
È anche possibile sostituire in una variabile locale contenente il fuso orario:
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. Eseguire query sulle tabelle temporali usando un fuso orario specifico
Nell'esempio seguente vengono selezionati i dati da una tabella temporale con l'ora solare Pacifico.
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;