AT TIME ZONE (Transact-SQL)
S’applique à : SQL Server 2016 (13.x) et versions ultérieures
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Point de terminaison analytique SQL dans Microsoft Fabric
Entrepô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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour