VID TIDSZON (Transact-SQL)

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-slutpunkt i Microsoft Fabric Warehouse i Microsoft FabricSQL Database i Microsoft Fabric

Satsen AT TIME ZONE Transact-SQL (T-SQL) konverterar en input_date till motsvarande datumtidsavvikningsvärde i måltidszonen. När input_date tillhandahålls utan offsetinformation tillämpar funktionen tidszonens offset under antagandet att input_date befinner sig i måltidszonen.

Om input_date anges som ett datumtidsavvikningsvärde , konverterar AT TIME ZONE klausulen det till måltidszonen med hjälp av tidszonskonverteringsreglerna.

Implementeringen AT TIME ZONE bygger på en Windows-mekanism för att konvertera datumtidsvärden över tidszoner.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

input_date

Ett uttryck som kan matchas till ett smalldatetime-, datetime-, datetime2- eller datetimeoffset-värde .

'time_zone_value'

Namnet på måltidszonen. time_zone_value är nvarchar(128).

SQL Server förlitar sig på tidszoner som lagras i Windows-registret. Tidszoner som är installerade på datorn lagras i följande registerdatafil: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

En lista över installerade tidszoner visas också via sys.time_zone_info systemvy.

Mer information om tidszoner för SQL Server i Linux finns i Konfigurera tidszonen för SQL Server 2022 och senare versioner på Linux.

{ 'time_zone_value' | 'LOKAL' }

Namnet på måltidszonen. time_zone_value är nvarchar(128), med standardvärdet .LOCAL

En lista över installerade tidszoner visas via sys.time_zone_info systemvy.

Om LOCAL anges anges det aktuella standardvärdet i tidszonen för sessionen till sessionens ursprungliga tidszonsvärde, vilket kan vara antingen databasbegränsat alternativ eller instansstandard.

Returtyper

Returnerar datatypen datetimeoffset.

Returvärde

Datetimeoffset-värdet i måltidszonen.

Remarks

AT TIME ZONE tillämpar specifika regler för att konvertera indatavärden i datatyperna smalldatetime, datetime och datetime2 som infaller i ett intervall som påverkas av en DST-ändring:

  • När klockan har ställts in framåt finns det en lucka i lokal tid som motsvarar klockjusteringens varaktighet. Den här varaktigheten är vanligtvis 1 timme, men det kan ta 30 eller 45 minuter, beroende på tidszon. Tidpunkter som finns i det här gapet konverteras med förskjutningen efter DST-ändringen.

    /*
      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
    
  • När klockan ställs in igen överlappas 2 timmars lokal tid till en timme. I så fall visas de tidpunkter som hör till det överlappande intervallet med förskjutningen innan klockan ändras:

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

Eftersom viss information (till exempel tidszonsregler) underhålls utanför SQL Server och kan komma att ändras tillfälligt, AT TIME ZONE klassificeras funktionen som icke-terministisk.

Datetimeoffset stöds inte i datalager i Microsoft Fabric, AT TIME ZONE men kan fortfarande användas med datetime2, som i följande exempel.

Examples

A. Lägg till måltidsförskjutning till datetime utan förskjutningsinformation

Använd AT TIME ZONE för att lägga till förskjutning baserat på tidszonsregler när du vet att de ursprungliga datetime-värdena anges i samma tidszon:

USE AdventureWorks2025;
GO

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

Här är resultatet.

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. Konvertera värden mellan olika tidszoner

I följande exempel konverteras värden mellan olika tidszoner. Värdena OrderDate är datetime och lagras inte med en förskjutning, men är kända för att vara Pacific Standard Time. Det första steget är att tilldela den kända förskjutningen och sedan konvertera till den nya tidszonen:

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;

Här är resultatet.

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

Du kan också ersätta i en lokal variabel som innehåller tidszonen:

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;

Här är resultatet.

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. Fråga temporala tabeller med hjälp av en specifik tidszon

Följande exempel väljer data från en tidstabell med WideWorldImporters hjälp av Pacific Standard Time.

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;

Här är resultatet.

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