datetime2 (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric
Définit une date qui est associée à une heure de la journée au format 24 heures. datetime2 peut être considéré comme une extension du type datetime existant qui a une plus grande plage de dates, une plus grande précision de fraction par défaut et une précision spécifiée par l’utilisateur facultative.
Description de datetime2
Property | Valeur |
---|---|
Syntaxe | datetime2 [ (précision à la fraction de seconde) ] |
Utilisation | DECLARE @MyDatetime2 datetime2(7); CREATE TABLE Table1 (Column1 datetime2(7)); |
Format de littéral de chaîne par défaut (utilisé pour le client de bas niveau) |
yyyy-MM-dd HH:mm:ss[.nnnnnnn] Pour plus d’informations, consultez Compatibilité descendante pour les clients de bas niveau plus loin dans cet article. |
Plage de dates | 0001-01-01 à 9999-12-31 Du 1er janvier de l’an 1 au 31 décembre 9999 |
Plage temporelle | 00:00:00 à 23:59:59.9999999 |
Plage de décalages de fuseau horaire | Aucun |
Plages d'éléments | yyyy est un nombre à quatre chiffres, allant de 0001 à 9999 , qui représente une année.MM est un nombre à deux chiffres, allant de 01 à 12 , qui représente un mois dans l’année spécifiée.dd est un nombre à deux chiffres, compris entre 01 le 31 mois et le mois, qui représente un jour du mois spécifié.HH est un nombre à deux chiffres, allant de 00 à 23 , qui représente l’heure.mm est un nombre à deux chiffres, allant de 00 à 59 , qui représente la minute.ss est un nombre à deux chiffres, allant de 00 à 59 , qui représente la seconde.n* est un nombre de zéro à sept chiffres compris entre 0 et 9999999 , qui représente les fractions de secondes. Dans Informatica, les fractions de seconde sont tronquées quand n est inférieur 3 à . |
Longueur de caractère | 19 positions minimales (yyyy-MM-dd HH:mm:ss ) à 27 maximum (yyyy-MM-dd HH:mm:ss.0000000 ) |
Précision, échelle | 0 à 7 chiffres, avec une précision de 100 nanosecondes (100 ns). La précision par défaut est de 7 chiffres. Dans Microsoft Fabric, cette précision peut être un entier compris entre 0 et 6, sans valeur par défaut. La précision doit être spécifiée dans Microsoft Fabric. |
Taille de stockage 1 | 6 octets pour une précision inférieure à 3. 7 octets pour une précision de 3 ou 4. Toute autre précision nécessite 8 octets. 2 |
Précision | 100 nanosecondes |
Valeur par défaut | 1900-01-01 00:00:00 |
Calendrier | Grégorien |
Précision à la fraction de seconde définie par l'utilisateur | Oui |
Prise en charge et conservation du décalage de fuseau horaire | Non |
Prise en charge de l'heure d'été | Non |
1 Les valeurs fournies sont destinées à un rowstore non compressé. L’utilisation de la compression des données ou columnstore peut modifier la taille de stockage pour chaque précision. En outre, la taille de stockage sur le disque et en mémoire peut différer. Par exemple, les valeurs datetime2 nécessitent toujours 8 octets en mémoire quand le mode batch est utilisé.
2 Lorsqu’une valeur datetime2 est convertie en valeur varbinary, un octet supplémentaire est ajouté à la valeur varbinary pour stocker la précision.
Pour connaître les métadonnées de type de données, consultez sys.systypes ou TYPEPROPERTY. La précision et l'échelle sont variables pour certains types de données de date et d'heure. Pour obtenir la précision et l’échelle d’une colonne, consultez COLUMNPROPERTY, COL_LENGTH ou sys.columns.
Formats de littéraux de chaîne pris en charge pour datetime2
Les tableaux suivants répertorient les formats de littéraux de chaîne ISO 8601 et ODBC pris en charge pour datetime2. 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 datetime2, consultez la date et l’heure.
ISO 8601 | Descriptions |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] |
Ce format n’est pas affecté par les paramètres régionaux de session et SET DATEFORMAT les SET LANGUAGE paramètres régionaux de session. Les T points deux-points (: ) et le point (. ) sont inclus dans le littéral de chaîne, par exemple 2024-05-02T19:58:47.1234567 . |
ODBC | Description |
---|---|
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } |
Spécifique à l'API ODBC : Le nombre de chiffres à droite de la virgule décimale, qui représente les fractions de seconde, peut être spécifié de 0 jusqu'à 7 (100 nanosecondes). |
Conformité ANSI et ISO 8601
La conformité ANSI et ISO 8601 de date et time s’applique à datetime2.
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_WSTR ou DBTYPE_STR | Java.sql.String | String ou SqString |
date | yyyy-MM-dd | SQL_WVARCHAR ou SQL_VARCHAR | DBTYPE_WSTR ou DBTYPE_STR | Java.sql.String | String ou SqString |
datetime2 | aaaa-MM-jj HH :mm :ss[.nnnnnnn] | SQL_WVARCHAR ou SQL_VARCHAR | DBTYPE_WSTR ou DBTYPE_STR | Java.sql.String | String ou SqString |
datetimeoffset | aaaa-MM-dd HH :mm :ss[.nnnnnnn] [+|-]hh :mm | SQL_WVARCHAR ou SQL_VARCHAR | DBTYPE_WSTR ou 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 de date et d’heure, le Moteur de base de données rejette toutes les valeurs qu’il ne peut pas reconnaître comme dates ou heures. Pour plus d’informations sur l’utilisation des fonctions CAST et CONVERT avec des données de date et d’heure, consultez CAST et CONVERT
Convertir d’autres types de date et d’heure en type de données datetime2
Cette section décrit ce qui se produit quand d’autres types de données date et time sont convertis en type de données datetime2.
Lors d’une conversion à partir du format date, l’année, le mois et le jour sont copiés. Le composant heure est défini sur 00:00:00.0000000. Le code suivant montre les résultats de la conversion d'une valeur date
en valeur datetime2
.
DECLARE @date AS DATE = '12-21-16';
DECLARE @datetime2 AS DATETIME2 = @date;
SELECT @datetime2 AS '@datetime2',
@date AS '@date';
Voici le jeu de résultats.
@datetime2 @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21
Lorsque la conversion est de time(n), le composant d’heure est copié et le composant de date est défini 1900-01-01
sur . L’exemple suivant montre les résultats de la conversion d’une valeur time(7) en valeur datetime2 .
DECLARE @time AS TIME (7) = '12:10:16.1234567';
DECLARE @datetime2 AS DATETIME2 = @time;
SELECT @datetime2 AS '@datetime2',
@time AS '@time';
Voici le jeu de résultats.
@datetime2 @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567
Dans le cas d’une conversion à partir de smalldatetime, les heures et les minutes sont copiées. Les secondes et fractions de seconde sont définies sur 0. Le code suivant montre les résultats de la conversion d'une valeur smalldatetime
en valeur datetime2
.
DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime2 AS DATETIME2 = @smalldatetime;
SELECT @datetime2 AS '@datetime2',
@smalldatetime AS '@smalldatetime';
Voici le jeu de résultats.
@datetime2 @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00
Dans le cas d’une conversion à partir de datetimeoffset(n), les composants date et heure sont copiés. Le fuseau horaire est tronqué. L'exemple suivant montre les résultats de la conversion d'une valeur datetimeoffset(7)
en valeur datetime2
.
DECLARE @datetimeoffset AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;
SELECT @datetime2 AS '@datetime2',
@datetimeoffset AS '@datetimeoffset';
Voici le jeu de résultats.
@datetime2 @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00
Dans le cas d’une conversion à partir de datetime, la date et l’heure sont copiées. La précision de fraction est étendue à 7 chiffres. L'exemple suivant montre les résultats de la conversion d'une valeur datetime
en valeur datetime2
.
DECLARE @datetime AS DATETIME = '2016-10-23 12:45:37.333';
DECLARE @datetime2 AS DATETIME2 = @datetime;
SELECT @datetime2 AS '@datetime2',
@datetime AS '@datetime';
Voici le jeu de résultats.
@datetime2 @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333
Effectuer un cast explicite en datetime2 lors de l’utilisation de datetime
Sous le niveau de compatibilité de base de données 130 et supérieur, les conversions implicites de datetime en types de données datetime2 montrent une précision améliorée en tenant compte des millisecondes fractionnaires, ce qui entraîne des valeurs converties différentes, comme indiqué dans l’exemple précédent. Utilisez un cast explicite en type de données datetime2 chaque fois qu’un scénario de comparaison mixte entre datetime et datetime2 datatypes existe. Pour plus d’informations, consultez les améliorations apportées à SQL Server et à Azure SQL Database pour gérer certains types de données et opérations rares.
Convertir des littéraux de chaîne en datetime2
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 datetime2.
Littéral de chaîne d'entrée | datetime2(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 datetime2 entraîne une conversion implicite entre datetime et ce type tel que défini par les règles de conversion. |
ODBC TIME |
Consultez la règle précédente ODBC DATE . |
ODBC DATETIME |
Consultez la règle précédente ODBC DATE . |
DATE uniquement |
La TIME partie est par défaut 00:00:00 . |
TIME uniquement |
La DATE partie est par défaut 1900-01-01 . |
TIMEZONE uniquement |
Les valeurs par défaut sont fournies. |
DATE + TIME |
Trivial. |
DATE + TIMEZONE |
Non autorisé. |
TIME + TIMEZONE |
La DATE partie est par défaut 1900-1-1. TIMEZONE l’entrée est ignorée. |
DATE + TIME + TIMEZONE |
Le local DATETIME est utilisé. |
Exemples
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';
Voici le jeu de résultats.
Type de données | Output |
---|---|
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 |