FUSO ORARIO (Transact-SQL)

Si applica a: SQL Server 2016 (13.x) e versioni successive di Istanza gestita di SQL diAzure Istanza gestita di SQL diAzure Azure Synapse Analyticsin Microsoft FabricWarehouse nel database SQL diMicrosoft Fabricin 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: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.

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