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 Analyticsin Microsoft FabricWarehouse 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 di 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. Un elenco dei fusi orari installati viene anche esposto attraverso la vista sys.time_zone_info (Transact-SQL).

Per altre informazioni sui fusi orari per SQL Server in Linux, vedere Configurare il fuso orario per SQL Server 2022 in Linux.

Tipo restituito

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 valori di inputdate sono datetime e non vengono archiviati con un offset, ma sono noti come Ora solare Pacifico. 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;

Passaggi successivi