W STREFIE CZASOWEJ (Transact-SQL)

Dotyczy: SQL Server 2016 (13.x) i nowsze wersje usługi Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics— punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse wbazie danych Microsoft Fabric SQL Database w usłudze Microsoft Fabric

Instrukcja AT TIME ZONE Transact-SQL (T-SQL) konwertuje input_date na odpowiadającą mu wartość datetimeoffset w docelowej strefie czasowej. Gdy input_date jest podawane bez informacji o przesunięciach, funkcja stosuje przesunięcie strefy czasowej, zakładając, że input_date znajduje się w docelowej strefie czasowej.

Jeśli input_date jest podana jako wartość datetimeoffset, to klauzula przekształca ją w docelową strefę czasową według reguł konwersji stref czasowych.AT TIME ZONE

Implementacja AT TIME ZONE opiera się na mechanizmie Windows do konwersji wartości daty między strefami czasowymi.

Transact-SQL konwencje składni

Syntax

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

Arguments

input_date

Wyrażenie, które można rozpoznać na wartość smalldatetime, datetime, datetime2 lub datetimeoffset.

'time_zone_value'

Nazwa docelowej strefy czasowej. time_zone_value to nvarchar(128).

Program SQL Server korzysta ze stref czasowych przechowywanych w rejestrze systemu Windows. Strefy czasowe zainstalowane na komputerze są przechowywane w następującej gałęzi rejestru: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

Lista zainstalowanych stref czasowych jest również widoczna w widoku sys.time_zone_info system.

Aby uzyskać więcej informacji na temat stref czasowych dla programu SQL Server w systemie Linux, zobacz Konfigurowanie strefy czasowej dla programu SQL Server 2022 i nowszych wersji systemu Linux.

{ 'time_zone_value' | 'LOKALNY' }

Nazwa docelowej strefy czasowej. time_zone_value to nvarchar(128), z domyślnym .LOCAL

Lista zainstalowanych stref czasowych jest dostępna w widoku sys.time_zone_info systemowym.

Jeśli LOCAL jest określona, to aktualna domyślna wartość strefy czasowej sesji jest ustalana na oryginalną wartość strefy czasowej sesji, która może być opcją skalą bazy danych lub domyślną instancją.

Typy zwracane

Zwraca typ danych typu datetimeoffset.

Wartość zwracana

Wartość datetimeoffset w docelowej strefie czasowej.

Remarks

AT TIME ZONEstosuje określone reguły konwertowania wartości wejściowych w typach danych smalldatetime, datetime i datetime2, które należą do interwału objętego zmianą DST:

  • Po ustawieniu zegara z wyprzedzeniem występuje różnica w czasie lokalnym równym czasowi trwania regulacji zegara. Ten czas trwania wynosi zwykle 1 godzinę, ale może wynosić 30 lub 45 minut, w zależności od strefy czasowej. Punkty w czasie, które znajdują się w tej przerwie, są konwertowane z przesunięciem po zmianie DST.

    /*
      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
    
  • Po ustawieniu zegara 2 godziny czasu lokalnego nakładają się na jedną godzinę. W takim przypadku punkty w czasie, które należą do nakładających się interwałów, są prezentowane z przesunięciem przed zmianą zegara:

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

Ponieważ niektóre informacje (takie jak reguły strefy czasowej) są przechowywane poza programem SQL Server i podlegają okazjonalnym zmianom, AT TIME ZONE funkcja jest klasowana jako nieokreślona.

Chociaż funkcja datetimeoffset nie jest obsługiwana w magazynowaniu danych w usłudze Microsoft Fabric, AT TIME ZONE nadal może być używana z funkcją datetime2, jak w poniższym przykładzie.

Examples

A. Dodawanie docelowego przesunięcia strefy czasowej do daty/godziny bez informacji o przesunięcie

Służy AT TIME ZONE do dodawania przesunięcia na podstawie reguł strefy czasowej, gdy wiadomo, że oryginalne wartości daty/godziny są podane w tej samej strefie czasowej:

USE AdventureWorks2025;
GO

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

Oto zestaw wyników.

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. Konwertowanie wartości między różnymi strefami czasowymi

Poniższy przykład konwertuje wartości między różnymi strefami czasowymi. Wartości OrderDate są typu data/godzina i nie są przechowywane z przesunięciem, ale są znane jako Czas standardowy pacyficzny. Pierwszym krokiem jest przypisanie znanego przesunięcia, a następnie przekonwertowanie na nową strefę czasową:

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;

Oto zestaw wyników.

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

Możesz również zastąpić zmienną lokalną zawierającą strefę czasową:

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;

Oto zestaw wyników.

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. Wykonywanie zapytań dotyczących tabel czasowych przy użyciu określonej strefy czasowej

Poniższy przykład wybiera dane z tabeli czasowej przy WideWorldImporters użyciu czasu standardowego Pacyfiku.

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;

Oto zestaw wyników.

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