Megosztás a következőn keresztül:


IDŐZÓNÁBAN (Transact-SQL)

A következőkre vonatkozik: Az SQL Server 2016 (13.x) és újabb verziói Az Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics végpontja a Microsoft FabricWarehouse-ban a Microsoft FabricSQL Database-ben a Microsoft Fabricben

A bemenetidátumot a cél időzóna megfelelő datetimeoffset értékére konvertálja. Ha az inputdátum eltolási információ nélkül van megadva, a függvény az időzóna eltolását alkalmazza, feltéve, hogy az inputdátum a cél időzónában van. Ha az inputdátumdatetimeoffset értékként van megadva, akkor AT TIME ZONE a záradék az időzóna-konverziós szabályok használatával átalakítja azt a cél időzónává.

AT TIME ZONE az implementáció egy Windows-mechanizmusra támaszkodik a datetime értékek időzónák közötti konvertálásához.

Transact-SQL szintaxis konvenciók

Syntax

inputdate AT TIME ZONE timezone

Arguments

inputdate

Kisdátum, datetime, datetime2 vagy datetimeoffset értékre feloldható kifejezés.

timezone

A cél időzóna neve. Az SQL Server a Windows beállításjegyzékben tárolt időzónákra támaszkodik. A számítógépre telepített időzónák a következő beállításjegyzék-hive-ben vannak tárolva: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. A telepített időzónák listája is megjelenik a sys.time_zone_info nézetben.

A Linuxon futó SQL Server időzónáiról további információt az SQL Server 2022 és újabb linuxos verzióinak időzónáinak konfigurálása című témakörben talál.

Visszatérési típusok

A datetimeoffset adattípusát adja vissza.

Visszaadott érték

A cél időzóna datetimeoffset értéke.

Remarks

AT TIME ZONE speciális szabályokat alkalmaz a bemeneti értékeknek a DST-változás által érintett intervallumba eső smalldatetime, datetime és datetime2 adattípusokban történő konvertálására:

  • Ha az óra előre van állítva, akkor a helyi idő egyenlő az órabeállítás időtartamával. Ez az időtartam általában 1 óra, de időzónától függően 30 vagy 45 perc is lehet. Az ebben a résben lévő pontok a DST-módosítás utáni eltolással lesznek konvertálva.

    /*
      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
    
  • Ha az óra vissza van állítva, akkor 2 óra helyi idő átfedésben van egy órára. Ebben az esetben az átfedésben lévő intervallumhoz tartozó időpontok az óraváltás előtt eltolással jelennek meg:

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

Mivel egyes információk (például az időzónák szabályai) az SQL Serveren kívül vannak fenntartva, és időnként módosulnak, a AT TIME ZONE függvény nemdeterminista besorolású.

Bár a datetimeoffset nem támogatott a Microsoft Fabric adattárházaiban, AT TIME ZONE a datetime2-vel továbbra is használható, ahogy az alábbi példában is látható.

Examples

A. Cél időzóna eltolásának hozzáadása dátumidőhöz eltolás adatai nélkül

Időzóna-szabályok alapján eltolás hozzáadására használható AT TIME ZONE , ha tudja, hogy az eredeti dátum/idő értékek ugyanabban az időzónában vannak megadva:

USE AdventureWorks2022;
GO

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

B. Értékek konvertálása különböző időzónák között

Az alábbi példa különböző időzónák közötti értékeket konvertál. Az OrderDate értékek dátumidők , és nem eltolással vannak tárolva, de ismerten csendes-óceáni téli időnek számítanak. Az első lépés az ismert eltolás hozzárendelése, majd az új időzónába való konvertálás:

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;

Az időzónát tartalmazó helyi változót is helyettesítheti:

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. Időbeli táblák lekérdezése adott időzónával

Az alábbi példa egy temporális tábla adatait választja ki a Pacific Standard Time használatával.

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;