Dela via


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 Förhandsversion av Microsoft Fabric

Konverterar ett indatadatum till motsvarande datetimeoffset-värde i måltidszonen. När inputdate tillhandahålls utan förskjutningsinformation tillämpar funktionen förskjutningen av tidszonen förutsatt att indata är i måltidszonen. Om inputdate anges som ett datetimeoffset-värdeAT TIME ZONE konverterar satsen det till måltidszonen med hjälp av tidszonskonverteringsreglerna.

AT TIME ZONE implementering bygger på en Windows-mekanism för att konvertera datetime-värden mellan tidszoner.

Transact-SQL syntaxkonventioner

Syntax

inputdate AT TIME ZONE timezone

Arguments

inputdate

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

timezone

Namnet på måltidszonen. SQL Server förlitar sig på tidszoner som lagras i Windows-registret. Tidszoner som är installerade på datorn lagras i följande registerdatafil: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. En lista över installerade tidszoner exponeras också via vyn sys.time_zone_info .

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

Return types

Returnerar datatypen datetimeoffset.

Return value

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

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

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

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

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

I följande exempel väljs data från en temporal tabell med Pacific Standard Time.

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;