datetimeoffset (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Définit une date combinée à une heure d’une journée basée sur une horloge de 24 heures, comme datetime2, et ajoute une prise en charge du fuseau horaire en fonction du temps universel coordonné (UTC).

Description de datetimeoffset

Propriété Valeur
Syntaxe DATETIMEOFFSET [ ( précision fractionnaire en secondes ) ]
Utilisation DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);
CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7));
Formats littéraux de chaîne par défaut (utilisés pour le client de bas niveau) aaaa-MM-dd HH :mm :ss[.nnnnnnn] [{+|-}hh :mm]

Pour plus d’informations, consultez la section Compatibilité descendante pour les clients de bas niveau qui suivent.
Plage de dates 0001-01-01 à 9999-12-31

Du 1er janvier de l’an 1 au 31 décembre 9999
Intervalle de temps 00:00:00 à 23:59:59.9999999
Plage de décalage de fuseau horaire -14:00 à +14:00
Plages d’éléments yyyy est de quatre chiffres, allant de 0001 à 9999, qui représentent une année.

MM est de deux chiffres, allant de 01 à 12, qui représentent un mois dans l’année spécifiée.
dd est de deux chiffres, allant de 01 à 31 selon le mois, qui représentent un jour du mois spécifié.
HH est deux chiffres, allant de 00 à 23, qui représentent l’heure.
mm est de deux chiffres, allant de 00 à 59, qui représentent la minute.
ss est deux chiffres, allant de 00 à 59, qui représentent la seconde.
n est égal à zéro à sept chiffres, allant de 0 à 9999999, qui représentent les fractions de seconde.
hh est deux chiffres allant de -14 à +14.
mm est deux chiffres allant de 00 à 59.
Longueur du caractère 26 positions minimales (aaaa-MM-jj HH :mm :ss {+|-}hh :mm) à 34 maximum (aaaa-MM-jj HH :mm :ss.nnnnnnn {+-}hh :mm)
Précision, échelle Consultez le tableau suivant.
Taille de stockage 10 octets, fixe est la valeur par défaut avec la valeur par défaut de 100-ns fractionnaire seconde précision.
Précision 100 nanosecondes
Valeur par défaut 1900-01-01 00:00:00 00:00
Calendrier Grégorien
Précision fractionnaire fractionnaire définie par l’utilisateur Oui
Décalage de fuseau horaire prenant en charge et conservation Oui
Prise en charge de l’enregistrement d’été Non
Échelle spécifiée Résultat (précision, échelle) Longueur de colonne (octets) Précision en fractions de seconde
datetimeoffset (34, 7) 10 7
datetimeoffset(0) (26, 0) 8 0 à 2
datetimeoffset(1) (28, 1) 8 0 à 2
datetimeoffset(2) (29, 2) 8 0 à 2
datetimeoffset(3) (30, 3) 9 3 à 4
datetimeoffset(4) (31, 4) 9 3 à 4
datetimeoffset(5) (32, 5) 10 5 à 7
datetimeoffset(6) (33, 6) 10 5 à 7
datetimeoffset(7) (34, 7) 10 5 à 7

Formats de littéraux de chaîne pris en charge pour datetimeoffset

Le tableau suivant répertorie les formats de littéraux de chaîne ISO 8601 pris en charge pour datetimeoffset. Pour plus d’informations sur les formats alphabétiques, numériques, nonparés et d’heure pour les parties de date et d’heure de datetimeoffset, consultez la date (Transact-SQL) et l’heure (Transact-SQL) .

ISO 8601 Description
aaaa-MM-ddTHH :mm :ss[.nnnnnnn][{+|-}hh :mm] Ces deux formats ne sont pas affectés par les paramètres régionaux de session et SET DATEFORMAT les SET LANGUAGE paramètres régionaux de session. Les espaces ne sont pas autorisés entre le datetimeoffset et les parties datetime .
aaaa-MM-ddTHH :mm :ss[.nnnnnnn]Z (UTC) Ce format par définition ISO indique que la partie datetime doit être exprimée dans le fuseau horaire UTC. Par exemple, 1999-12-12 12:30:30.12345 -07:00 doit être représenté en tant que 1999-12-12 19:30:30.12345Z.

L’exemple suivant compare les résultats de la conversion d’une chaîne en chaque type de données date et time.

SELECT CAST('2007-05-08 12:35:29. 1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2007-05-08 12:35:29. 1234567 +12:15' AS DATE) AS 'date',
    CAST('2007-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2007-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2007-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset',
    CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset IS08601';

Voici le jeu de résultats obtenu.

Type de données Sortie
time 12:35:29.1234567
date 2007-05-08
smalldatetime 2007-05-08 12:35:00
datetime 2007-05-08 12:35:29.123
datetime2 2007-05-08 12:35:29.1234567
datetimeoffset 2007-05-08 12:35:29.1234567 +12:15
datetimeoffset IS08601 2007-05-08 12:35:29.1234567 +12:15

Décalage de fuseau horaire

Un décalage de fuseau horaire spécifie le décalage de la zone de fuseau horaire UTC pour une valeur time ou datetime. Le décalage de fuseau horaire peut être représenté sous la forme [+|-] hh:mm:

  • hh est deux chiffres allant de 00 à 14 et représentant le nombre d’heures dans le décalage de fuseau horaire.

  • mm est de deux chiffres, allant de 00 à 59, qui représentent le nombre de minutes supplémentaires dans le décalage de fuseau horaire.

  • + (plus) ou - (moins) est le signe obligatoire pour un décalage de fuseau horaire. Ce signe indique si le décalage de fuseau horaire est ajouté ou soustrait de l’heure UTC pour obtenir l’heure locale. La plage valide du décalage de fuseau horaire se situe entre -14:00 et +14:00.

La plage de décalage de fuseau horaire suit la norme XML W3C pour la définition de schéma XSD, et est légèrement différente de la définition standard SQL 2003, 12:59 à +14:00.

Le paramètre de type facultatif précision à la fraction de seconde spécifie le nombre de chiffres pour la partie fractionnaire des secondes. Cette valeur peut être un entier avec 0 à 7 chiffres (100 nanosecondes). La précision fractionnaire par défaut est de 100 ns (sept chiffres pour la partie fractionnaire des secondes).

Les données sont stockées dans la base de données, puis traitées, comparées, triées et indexées sur le serveur comme au format UTC. Le décalage de fuseau horaire est conservé dans la base de données pour la récupération.

Le décalage de fuseau horaire donné est supposé être conscient de l’heure d’été (DST) et ajusté pour toute datetime donnée qui se trouve dans la période DST.

Pour le type datetimeoffset , à la fois UTC et local (au décalage de fuseau horaire persistant ou converti), la valeur datetime est validée lors de l’insertion, de la mise à jour, de l’arithmétique, de la conversion ou de l’affectation d’opérations. La détection d’une valeur datetime utc ou locale non valide (au décalage de fuseau horaire persistant ou converti) génère une erreur de valeur non valide. Par exemple, 9999-12-31 10:10:00 est valide au format UTC, mais dépasse l’heure locale pour le décalage +13:50de fuseau horaire.

Syntaxe de conversion de fuseau horaire

SQL Server 2016 (13.x) a introduit la syntaxe pour faciliter les conversions de fuseau horaire universels prenant en charge l’été AT TIME ZONE . Cette syntaxe est particulièrement utile lors de la conversion de données sans décalages de fuseau horaire, en données avec des décalages de fuseau horaire. Pour convertir en valeur datetimeoffset correspondante dans un fuseau horaire cible, consultez AT TIME ZONE.

Conformité ANSI et ISO 8601

Les sections de conformité ANSI et ISO 8601 des articles de date et d’heure s’appliquent à datetimeoffset.

Compatibilité descendante pour les clients de bas niveau

Certains clients de bas niveau ne prennent pas en charge les types de données time, date, datetime2 et datetimeoffset. Le tableau suivant présente le type de mappage entre une instance de haut niveau de SQL Server et des clients de bas niveau.

Type de données SQL Server Format de littéral de chaîne par défaut passé au client de bas niveau ODBC de bas niveau OLEDB de bas niveau JDBC de bas niveau SQLCLIENT de bas niveau
time HH :mm :ss[.nnnnnnn] SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString
date yyyy-MM-dd SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString
datetime2 aaaa-MM-jj HH :mm :ss[.nnnnnnn] SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString
datetimeoffset aaaa-MM-dd HH :mm :ss[.nnnnnnn] [+|-]hh :mm SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString

Convertir des données de date et d’heure

Lorsque vous convertissez en types de données date et heure, SQL Server rejette toutes les valeurs qu’il ne peut pas reconnaître comme des dates ou des heures. Pour plus d’informations sur l’utilisation des CAST fonctions avec CONVERT des données de date et d’heure, consultez CAST et CONVERT.

Convertir en type de données datetimeoffset

Cette section fournit un exemple de mise à jour des données à partir d’un type de données sans décalage vers une nouvelle colonne de type de données datetimeoffset .

Tout d’abord, vérifiez le nom du fuseau horaire à partir de l’affichage catalogue système sys.time_zone_info .

SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';

L’exemple suivant utilise deux fois la syntaxe AT TIME ZONE . L’exemple de code crée une table dbo.Audit, ajoute des données qui s’étendent sur plusieurs modifications d’heure d’été et ajoute une nouvelle colonne datetimeoffset . Nous partons du principe que la AuditCreated colonne est un type de données *datetime2 sans décalages et qu’elle a été écrite à l’aide du fuseau horaire UTC.

Dans l’instructionUPDATE, la AT TIME ZONE syntaxe ajoute d’abord un décalage de fuseau horaire UTC aux données de colonne existantesAuditCreated, puis convertit les données utc en Pacific Standard Timeajustement correct des données historiques pour chaque plage de temps d’été passée dans le États-Unis.

CREATE TABLE dbo.Audit (AuditCreated DATETIME2(0) NOT NULL);
GO

INSERT INTO dbo.Audit (AuditCreated)
VALUES ('1/1/2024 12:00:00');

INSERT INTO dbo.Audit (AuditCreated)
VALUES ('5/1/2024 12:00:00');

INSERT INTO dbo.Audit (AuditCreated)
VALUES ('12/1/2024 12:00:00');
GO

ALTER TABLE dbo.Audit
ADD AuditCreatedOffset DATETIMEOFFSET(0) NULL;
GO

DECLARE @TimeZone VARCHAR(50);

SELECT @TimeZone = [name]
FROM sys.time_zone_info
WHERE [name] = 'Pacific Standard Time';

UPDATE dbo.Audit
SET AuditCreatedOffset = AuditCreated
    AT TIME ZONE 'UTC' AT TIME ZONE @TimeZone
WHERE AuditCreatedOffset IS NULL;
GO

SELECT *
FROM dbo.Audit;

Voici le jeu de résultats obtenu.

AuditCreated         AuditCreatedOffset
-------------------  --------------------------
2024-01-01 12:00:00  2024-01-01 04:00:00 -08:00
2024-05-01 12:00:00  2024-05-01 05:00:00 -07:00
2024-12-01 12:00:00  2024-12-01 04:00:00 -08:00

Convertir le type de données datetimeoffset en d’autres types de date et d’heure

Cette section décrit ce qui se produit quand un type de données datetimeoffset est converti en d’autres types de données date et time.

Lorsque vous convertissez en date, l’année, le mois et le jour sont copiés. Le code suivant montre les résultats de la conversion d’une valeur datetimeoffset(4) en valeur de date .

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';

Voici le jeu de résultats obtenu.

@datetimeoffset                 date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10

Si la conversion est en time(n),l’heure, la minute, la seconde et les fractions de seconde sont copiées. La valeur de fuseau horaire est tronquée. Lorsque la précision de la valeur datetimeoffset(n) est supérieure à la précision de la valeur time(n), la valeur est arrondie. Le code suivant montre les résultats de la conversion d’une valeur datetimeoffset(4) en valeur time(3).

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time TIME(3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';

Voici le jeu de résultats obtenu.

@datetimeoffset                 time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124

Lorsque vous convertissez en datetime, les valeurs de date et d’heure sont copiées et le fuseau horaire est tronqué. Lorsque la précision fractionnelle de la valeur datetimeoffset(n) est supérieure à trois chiffres, la valeur est tronquée. Le code suivant montre les résultats de la conversion d’une valeur datetimeoffset(4) en valeur datetime .

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';

Voici le jeu de résultats obtenu.

@datetimeoffset                datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123

Dans le cas d’une conversion en smalldatetime, la date et les heures sont copiées. Les minutes sont arrondies selon la valeur des secondes et les secondes sont définies sur 0. Le code suivant montre les résultats de la conversion d’une valeur datetimeoffset(3) en valeur smalldatetime .

DECLARE @datetimeoffset DATETIMEOFFSET(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime SMALLDATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';

Voici le jeu de résultats obtenu.

@datetimeoffset                @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00

Si la conversion est en datetime2(n), la date et l’heure sont copiées dans la valeur datetime2 et le fuseau horaire est tronqué. Lorsque la précision de la valeur datetime2(n) est supérieure à la précision de la valeur datetimeoffset(n), les fractions de seconde sont tronquées pour s’adapter. Le code suivant montre les résultats de la conversion d’une valeur datetimeoffset(4) en valeur datetime2(3).

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 DATETIME2(3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';

Voici le jeu de résultats obtenu.

@datetimeoffset                    @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12

Convertir des littéraux de chaîne en datetimeoffset

Les conversions de littéraux de chaîne en types de date et d'heure sont autorisées si toutes les parties des chaînes sont dans des formats valides. Sinon, une erreur d'exécution est déclenchée. Les conversions implicites ou les conversions explicites qui ne spécifient pas de style, des types de date et d’heure aux littéraux de chaîne sont au format par défaut de la session active. Le tableau suivant montre les règles de conversion d’un littéral de chaîne en type de données datetimeoffset.

Littéral de chaîne d'entrée datetimeoffset(n)
ODBC DATE Les littéraux de chaîne ODBC sont mappés au type de données datetime. Toute opération d’affectation de ODBC DATETIME littéraux en types datetimeoffset entraîne une conversion implicite entre datetime et ce type, tel que défini par les règles de conversion.
ODBC TIME Voir la règle précédente ODBC DATE
ODBC DATETIME Voir la règle précédente ODBC DATE
DATE uniquement La TIME partie est par défaut 00:00:00. Valeurs TIMEZONE par défaut +00:00
TIME uniquement La DATE partie est par défaut 1900-1-1. Valeurs TIMEZONE par défaut +00:00
TIMEZONE uniquement Les valeurs par défaut sont fournies
DATE + TIME Valeurs TIMEZONE par défaut +00:00
DATE + TIMEZONE Non autorisé
TIME + TIMEZONE La partie DATE est par défaut 1900-1-1
DATE + TIME + TIMEZONE Simple