Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: SQL Server 2016 (13.x) e versioni
successive di Istanza gestita di SQL di
Azure Istanza
gestita di SQL diAzure Azure Synapse Analytics
in Microsoft FabricWarehouse nel database SQL di
Microsoft Fabric
in Microsoft Fabric
L'istruzione AT TIME ZONE Transact-SQL (T-SQL) converte un input_date nel corrispondente valore datetimeoffset nel fuso orario di destinazione. Quando input_date viene fornito senza informazioni di offset, la funzione applica l'offset del fuso orario assumendo che input_date sia nel fuso orario target.
Se input_date viene fornito come valore di decalco, la AT TIME ZONE clausola lo converte nel fuso orario target utilizzando le regole di conversione del fuso orario.
L'implementazione AT TIME ZONE si basa su un meccanismo Windows per convertire i valori delle data-ora tra i fusi orari.
Convenzioni relative alla sintassi Transact-SQL
Syntax
input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }
Arguments
input_date
Espressione che può essere risolta in un valore smalldatetime, datetime, datetime2 o datetimeoffset.
'time_zone_value'
Nome del fuso orario di destinazione. time_zone_value è Nvarchar (128).
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: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.
Un elenco dei fusi orari installati è inoltre mostrato attraverso la vista sys.time_zone_info sistema.
Per altre informazioni sui fusi orari per SQL Server in Linux, vedere Configurare il fuso orario per SQL Server 2022 e versioni successive in Linux.
{ 'time_zone_value' | 'LOCALE' }
Nome del fuso orario di destinazione.
time_zone_value è nvarchar(128), con un predefinito di LOCAL.
Un elenco dei fusi orari installati viene mostrato attraverso la vista sys.time_zone_info sistema.
Se LOCAL è specificato, allora il valore predefinito attuale del fuso orario della sessione viene impostato al valore originale del fuso orario della sessione, che può essere sia l'opzione con scopo del database sia il valore predefinito dell'istanza.
Tipi restituiti
Restituisce il tipo di dati di datetimeoffset.
Valore restituito
Il valore datetimeoffset nel fuso orario di destinazione.
Remarks
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:00Quando 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.
Examples
A. 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 AdventureWorks2025;
GO
SELECT SalesOrderID,
OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
Il set di risultati è il seguente.
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. 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 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;
Il set di risultati è il seguente.
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
...
È anche possibile sostituire in una variabile locale contenente il fuso orario:
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;
Il set di risultati è il seguente.
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. Eseguire query sulle tabelle temporali usando un fuso orario specifico
Il seguente esempio seleziona dati da una tabella temporale usando WideWorldImporters l'ora standard del Pacifico.
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;
Il set di risultati è il seguente.
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