Delen via


TIJDZONE (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-eindpunt in Microsoft Fabric,Warehouse in Microsoft Fabric,SQL Database in Microsoft Fabric Preview

Converteert een invoerdatum naar de bijbehorende datum/tijdoffset-waarde in de doeltijdzone. Wanneer invoerdatum wordt opgegeven zonder offsetgegevens, past de functie de offset van de tijdzone toe, ervan uitgaande dat invoerdatum zich in de doeltijdzone bevindt. Als invoerdatum wordt opgegeven als een datum/tijdoffset-waarde , AT TIME ZONE converteert de component deze naar de doeltijdzone met behulp van de regels voor tijdzoneconversie.

AT TIME ZONE implementatie is afhankelijk van een Windows-mechanisme voor het converteren van datum/tijd-waarden tussen tijdzones.

Transact-SQL syntaxis-conventies

Syntax

inputdate AT TIME ZONE timezone

Arguments

inputdate

Een expressie die kan worden omgezet in een waarde voor smalldatetime, datetime, datetime2 of datetimeoffset.

timezone

Naam van de doeltijdzone. SQL Server is afhankelijk van tijdzones die zijn opgeslagen in het Windows-register. Tijdzones die op de computer zijn geïnstalleerd, worden opgeslagen in de volgende register hive: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. Er wordt ook een lijst met geïnstalleerde tijdzones weergegeven via de sys.time_zone_info weergave.

Zie De tijdzone configureren voor SQL Server 2022 en latere versies op Linux voor meer informatie over tijdzones voor SQL Server op Linux.

Return types

Retourneert het gegevenstype datetimeoffset.

Return value

De datum/tijdoffset-waarde in de doeltijdzone.

Remarks

AT TIME ZONEpast specifieke regels toe voor het converteren van invoerwaarden in gegevenstypen smalldatetime, datetime en datetime2 die vallen onder een interval dat wordt beïnvloed door een DST-wijziging:

  • Wanneer de klok vooruit is, is er een tussenruimte in de lokale tijd die gelijk is aan de duur van de klokaanpassing. Deze duur is meestal 1 uur, maar kan 30 of 45 minuten zijn, afhankelijk van de tijdzone. Punten in de tijd die zich in deze kloof bevinden, worden geconverteerd met de offset na DST-wijziging.

    /*
      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
    
  • Wanneer de klok is teruggezet, worden 2 uur lokale tijd overlapt op één uur. In dat geval worden punten in de tijd die deel uitmaken van het overlappende interval weergegeven met de offset voordat de klok verandert:

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

Omdat bepaalde informatie (zoals tijdzoneregels) buiten SQL Server wordt onderhouden en af en toe kan worden gewijzigd, wordt de AT TIME ZONE functie als niet-deterministisch beschouwd.

Datetimeoffset wordt niet ondersteund in datawarehousing in Microsoft Fabric, AT TIME ZONE maar kan nog steeds worden gebruikt met datetime2, zoals in het volgende voorbeeld.

Examples

A. Doeltijdzone-offset toevoegen aan datum/tijd zonder offsetgegevens

Gebruik AT TIME ZONE dit om offset toe te voegen op basis van tijdzoneregels wanneer u weet dat de oorspronkelijke datum/tijd-waarden in dezelfde tijdzone worden opgegeven:

USE AdventureWorks2022;
GO

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

B. Waarden tussen verschillende tijdzones converteren

In het volgende voorbeeld worden waarden tussen verschillende tijdzones geconverteerd. De OrderDate waarden zijn datum/tijd en worden niet opgeslagen met een offset, maar zijn bekend als Pacific Standard Time. De eerste stap is het toewijzen van de bekende offset en vervolgens converteren naar de nieuwe tijdzone:

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;

U kunt ook vervangen door een lokale variabele die de tijdzone bevat:

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. Tijdelijke tabellen opvragen met behulp van een specifieke tijdzone

In het volgende voorbeeld worden gegevens uit een tijdelijke tabel geselecteerd met behulp van 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;