Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : SQL Server 2016 (13.x) et versions
ultérieures d’Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics SQL Analytics
dans Microsoft Fabric
Warehouse dans microsoft Fabric
SQL Database dans Microsoft Fabric SQL Database dans Microsoft Fabric
L’instruction AT TIME ZONE Transact-SQL (T-SQL) convertit un input_date en la valeur correspondante de décalage datetimetime dans le fuseau horaire cible. Lorsque input_date est fourni sans information de décalage, la fonction applique le décalage du fuseau horaire en supposant que input_date soit dans le fuseau horaire cible.
Si input_date est fourni comme une valeur de décalage datetime , alors AT TIME ZONE la clause la convertit dans le fuseau horaire cible en utilisant les règles de conversion de fuseau horaire.
L’implémentation AT TIME ZONE repose sur un mécanisme Windows pour convertir les valeurs de date-heure à travers les fuseaux horaires.
Conventions de la syntaxe Transact-SQL
Syntax
input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }
Arguments
input_date
Expression qui peut être résolue en une valeur smalldatetime, datetime, datetime2 ou datetimeoffset.
« time_zone_value »
Nom du fuseau horaire de destination. time_zone_value est Nvarchar(128).
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 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Une liste des fuseaux horaires installés est également affichée via la vue système sys.time_zone_info .
Pour plus d’informations sur les fuseaux horaires pour SQL Server sur Linux, consultez Configurer le fuseau horaire pour SQL Server 2022 et versions ultérieures sur Linux.
{ 'time_zone_value' | 'LOCAL' }
Nom du fuseau horaire de destination.
time_zone_value est nvarchar(128), avec pour défaut de LOCAL.
Une liste des fuseaux horaires installés est affichée via la vue système sys.time_zone_info .
Si LOCAL est spécifié, alors la valeur actuelle par défaut du fuseau horaire de la session est fixée à la valeur originale du fuseau horaire de la session, qui peut être soit une option par cahier de données (data scoped), soit la valeur par défaut de l’instance.
Types de retour
Retourne le type de données de datetimeoffset.
Valeur retournée
Valeur datetimeoffset dans le fuseau horaire cible.
Remarks
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:00Quand 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.
Même si datetimeoffset n’est pas pris en charge dans l’entreposage de données dans Microsoft Fabric, AT TIME ZONE il est toujours possible d’utiliser datetime2, comme dans l’exemple suivant.
Examples
A. 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 AdventureWorks2025;
GO
SELECT SalesOrderID,
OrderDate,
OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;
Voici l’ensemble des résultats.
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. Convertir des valeurs entre des fuseaux horaires différents
L’exemple suivant convertit les valeurs entre différents fuseaux horaires. Les OrderDate valeurs sont datetime et ne sont pas stockées avec un décalage, mais sont connues comme heure standard du Pacifique. La première étape consiste à assigner le décalage connu, puis à effectuer la conversion vers le nouveau fuseau horaire :
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;
Voici l’ensemble des résultats.
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
...
Vous pouvez également effectuer le remplacement dans une variable locale contenant le fuseau horaire :
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;
Voici l’ensemble des résultats.
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. Interroger des tables temporelles en utilisant un fuseau horaire spécifique
L’exemple suivant sélectionne des données à partir d’une table temporelle en WideWorldImporters utilisant l’heure standard du Pacifique.
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;
Voici l’ensemble des résultats.
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