AT TIME ZONE (Transact-SQL)

S’applique à : SQL Server 2016 (13.x) et versions ultérieuresAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPoint de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

Convertit une valeur inputdate en valeur datetimeoffset correspondante dans le fuseau horaire cible. Quand la valeur inputdate est fournie sans informations sur le décalage, la fonction applique le décalage du fuseau horaire en supposant que la valeur inputdate figure dans le fuseau horaire cible. Si la valeur inputdate est fournie en tant que valeur datetimeoffset, la clause AT TIME ZONE la convertit dans le fuseau horaire cible selon les règles de conversion de fuseau horaire.

L’implémentation AT TIME ZONE utilise un mécanisme Windows pour convertir les valeurs datetime sur plusieurs fuseaux horaires.

Conventions de la syntaxe Transact-SQL

Syntaxe

inputdate AT TIME ZONE timezone

Arguments

inputdate

Expression qui peut être résolue en une valeur smalldatetime, datetime, datetime2 ou datetimeoffset.

timezone

Nom du fuseau horaire de destination. SQL Server se base sur les fuseaux horaires qui sont stockés dans le Registre Windows. Les fuseaux horaires installés sur l’ordinateur sont stockés dans la ruche de Registre suivante : KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones Vous pouvez également consulter une liste des fuseaux horaires installés dans la vue sys.time_zone_info (Transact-SQL).

Pour plus d’informations sur les fuseaux horaires pour SQL Server sur Linux, consultez Configurer le fuseau horaire pour SQL Server 2022 sur Linux.

Type de retour

Retourne le type de données de datetimeoffset.

Valeur retournée

Valeur datetimeoffset dans le fuseau horaire cible.

Notes

AT TIME ZONE applique des règles spécifiques pour la conversion des valeurs d’entrée de types smalldatetime, datetime et datetime2 qui se trouvent dans un intervalle de temps impacté par le passage à l’heure d’été (DST) :

  • Quand l’horloge est avancée, il y a un écart avec l’heure locale égal à la durée de l’ajustement de l’horloge. Cette durée est généralement d’une heure, mais elle peut être de 30 ou 45 minutes selon le fuseau horaire. Les heures comprises dans cet intervalle sont converties avec le décalage après le passage à l’heure d’été.

    /*
      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
    
  • Quand l’horloge est reculée, deux heures de l’heure locale se chevauchent sur une heure. Dans ce cas, les heures comprises dans cet intervalle avec chevauchement sont présentées avec le décalage avant l’ajustement de l’horloge :

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

Étant donné que certaines informations (comme les règles de fuseau horaire) sont conservées en dehors de SQL Server et sont susceptibles de changer ponctuellement, la fonction AT TIME ZONE est classée comme non déterministe.

Bien que datetimeoffset ne soit pas pris en charge dans l’entreposage de données dans Microsoft Fabric, AT TIME ZONE peut toujours être utilisé avec datetime2, comme dans l’exemple suivant.

Exemples

R. Ajouter un décalage de fuseau horaire cible à la valeur datetime sans informations sur le décalage

Utilisez AT TIME ZONE pour ajouter un décalage basé sur les règles de fuseau horaire quand vous savez que les valeurs datetime initiales sont fournies dans le même fuseau horaire :

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

B. Convertir des valeurs entre des fuseaux horaires différents

L’exemple suivant convertit les valeurs entre différents fuseaux horaires. Les valeurs inputdate sont au format datetime et ne sont pas stockées avec un décalage (elles sont connues pour être à l’Heure standard du Pacifique). La première étape consiste à assigner le décalage connu, puis à effectuer la conversion vers le nouveau fuseau horaire :

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;

Vous pouvez également effectuer le remplacement dans une variable locale contenant le fuseau horaire :

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. Interroger des tables temporelles en utilisant un fuseau horaire spécifique

L’exemple suivant sélectionne des données d’une table temporelle en utilisant l’heure standard du Pacifique.

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;

Étapes suivantes