V ČASOVÉM PÁSMU (Transact-SQL)

Platí pro: SQL Server 2016 (13.x) a novější verze koncového bodu Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticsv Microsoft FabricWarehouse v databázi Microsoft FabricSQL v Microsoft Fabric

Příkaz AT TIME ZONE Transact-SQL (T-SQL) převádí input_date na odpovídající hodnotu datetimeoffset v cílovém časovém pásmu. Pokud je input_date uvedeno bez informací o posunu, funkce aplikuje posun časového pásma za předpokladu, že input_date je v cílovém časovém pásmu.

Pokud je input_date uvedena jako hodnota datetimeoffset , AT TIME ZONE pak klauzule ji převede na cílové časové pásmo pomocí pravidel pro převod časových pásem.

Implementace AT TIME ZONE spoléhá na mechanismus Windows pro převod datových hodnot napříč časovými pásmy.

Transact-SQL konvence syntaxe

Syntax

input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }

Arguments

input_date

Výraz, který lze přeložit na hodnotu smalldatetime, datetime, datetime2 nebo datetimeoffset.

'time_zone_value'

Název cílového časového pásma time_zone_value je nvarchar(128).

SQL Server spoléhá na časová pásma uložená v registru Systému Windows. Časová pásma nainstalovaná v počítači jsou uložena v následujícím podregistru registru: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

Seznam instalovaných časových pásem je také zobrazen v pohledu sys.time_zone_info systém.

Další informace o časových pásmech pro SQL Server v Linuxu najdete v tématu Konfigurace časového pásma pro SQL Server 2022 a novější verze v Linuxu.

{ 'time_zone_value' | 'MÍSTNÍ' }

Název cílového časového pásma time_zone_value je nvarchar(128), s výchozím hodnotou LOCAL.

Seznam nainstalovaných časových pásem je zobrazen prostřednictvím sys.time_zone_info systémového pohledu.

Pokud LOCAL je specifikováno, pak je aktuální výchozí hodnota časového pásma relace nastavena na původní hodnotu časového pásma relace, což může být buď databázově omezená volba, nebo výchozí instance instance.

Návratové typy

Vrátí datový typ datetimeoffset.

Návratová hodnota

Hodnota datetimeoffset v cílovém časovém pásmu.

Remarks

AT TIME ZONEpoužije specifická pravidla pro převod vstupních hodnot v datových typech smalldatetime, datetime a datetime2, které spadají do intervalu ovlivněného změnou DST:

  • Když jsou hodiny nastavené dopředu, je v místním čase mezera rovna době trvání úpravy hodin. Tato doba trvání je obvykle 1 hodina, ale v závislosti na časovém pásmu může být 30 nebo 45 minut. Body v čase, které jsou v této mezerě, se po změně DST převedou s posunem.

    /*
      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
    
  • Když se hodiny nastaví zpět, překryjí se 2 hodiny místního času na jednu hodinu. V takovém případě se body v čase, které patří do překrývajícího se intervalu, zobrazí posun před změnou hodin:

    /*
        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
    

Vzhledem k tomu, že některé informace (například pravidla časového pásma) se uchovávají mimo SQL Server a můžou se občas měnit, AT TIME ZONE je funkce klasifikovaná jako nedeterministická.

I když datatimeoffset není v datových skladech v Microsoft Fabric podporováno, AT TIME ZONE můžete ho dál používat s datetime2, jak je znázorněno v následujícím příkladu.

Examples

A. Přidání posunu cílového časového pásma k datetime bez informací o posunu

Umožňuje AT TIME ZONE přidat posun na základě pravidel časového pásma, když víte, že původní hodnoty data a času jsou k dispozici ve stejném časovém pásmu:

USE AdventureWorks2025;
GO

SELECT SalesOrderID,
       OrderDate,
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;

Tady je soubor výsledků.

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. Převod hodnot mezi různými časovými pásmy

Následující příklad převede hodnoty mezi různými časovými pásmy. Hodnoty OrderDate jsou datetime a neukládají se s posunem, ale jsou známé jako Tichomoří (běžný čas). Prvním krokem je přiřazení známého posunu a následné převedení na nové časové pásmo:

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;

Tady je soubor výsledků.

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
...

Můžete také nahradit místní proměnnou obsahující časové pásmo:

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;

Tady je soubor výsledků.

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. Dotazování dočasných tabulek pomocí určitého časového pásma

Následující příklad vybírá data z časové tabulky pomocí WideWorldImporters pacifického standardního času.

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;

Tady je soubor výsledků.

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