Udostępnij za pomocą


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

Konwertuje inputdate na odpowiadającą wartość datetimeoffset w docelowej strefie czasowej. W przypadku podania danych wejściowych bez informacji o przesunięciu funkcja stosuje przesunięcie strefy czasowej przy założeniu, że inputdate znajduje się w docelowej strefie czasowej. Jeśli wartość inputdate jest podana jako wartość datetimeoffset , AT TIME ZONE klauzula konwertuje ją na docelową strefę czasową przy użyciu reguł konwersji strefy czasowej.

AT TIME ZONE implementacja opiera się na mechanizmie systemu Windows do konwertowania wartości daty/godziny w strefach czasowych.

Transact-SQL konwencje składni

Syntax

inputdate AT TIME ZONE timezone

Arguments

inputdate

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

timezone

Nazwa docelowej strefy czasowej. 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: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. Lista zainstalowanych stref czasowych jest również widoczna w widoku sys.time_zone_info .

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.

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 AdventureWorks2022;
GO

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

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 OrderDatetypu 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 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;

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

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

W poniższym przykładzie dane są wybierane z tabeli czasowej przy użyciu czasu standardowego pacyficznego.

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;