datetime2 (Transact-SQL)

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 fractionnaire par défaut et une précision spécifiée par l'utilisateur facultative.

Description de datetime2

Propriété

Valeur

Syntaxe

datetime2 [ (fractional seconds precision) ]

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)

AAAA-MM-JJ hh:mm:ss[.fractions de seconde]

Pour plus d'informations, consultez la section « Compatibilité descendante pour les clients de bas niveau » qui suit.

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

AAAA est un nombre de quatre chiffres, entre 0001 et 9999, qui représente une année.

MM est un nombre à deux chiffres, entre 01 et 12, qui représente un mois dans l'année spécifiée.

DD est un nombre à deux chiffres, entre 01 et 31 selon le mois, qui représente un jour du mois spécifié.

hh est un nombre à deux chiffres, entre 00 et 23, qui représente l'heure.

mm est un nombre à deux chiffres, entre 00 et 59, qui représente la minute.

ss est un nombre à deux chiffres, entre 00 et 59, qui représente la seconde.

n* est un nombre qui comprend entre zéro et sept chiffres, entre 0 et 9999999, qui représente les fractions de seconde.

Longueur de caractère

19 positions au minimum (AAAA-MM-JJ hh:mm:ss) et 27 au maximum (AAAA-MM-JJ hh:mm:ss.0000000)

Précision, échelle

De 0 à 7 chiffres, avec une précision de 100 ns. La précision par défaut est de 7 chiffres.

Taille de stockage

6 octets pour des précisions inférieures à 3 chiffres ; 7 octets pour des précisions égales à 3 et 4 chiffres. Toutes les autres précisions requièrent 8 octets.

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

Pour afficher les métadonnées de type de données, consultez sys.systypes (Transact-SQL) ou TYPEPROPERTY (Transact-SQL). 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 (Transact-SQL), COL_LENGTH (Transact-SQL) ou sys.columns (Transact-SQL).

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étique, numérique, non séparé et d'heure pour les parties de date et d'heure de datetime2, consultez date (Transact-SQL) et time (Transact-SQL).

ISO 8601

Descriptions

YYYY-MM-DDThh:mm:ss[. nnnnnnn]

YYYY-MM-DDThh:mm:ss[. nnnnnnn]

Ce format n'est pas affecté par les paramètres régionaux de session SET LANGUAGE et SET DATEFORMAT. T, le signe deux-points (:) et le point (.) sont inclus dans le littéral de chaîne, par exemple « 2007-05-02T19:58:47.1234567 ».

ODBC

Description

{ ts 'aaaa-mm-jj hh:mm:ss[.fractions de seconde]' }

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).

  • Dans SQL Server 2012, le niveau de compatibilité étant égal à 10, le littéral mappera en interne au nouveau type time.

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 2012

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

AAAA-MM-JJ

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

String ou SqString

datetime2

YYYY-MM-DD hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

String ou SqString

datetimeoffset

YYYY-MM-DD hh:mm:ss[. nnnnnnn] [+|-]hh:mm

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

String ou SqString

Conversion de données de date et d'heure

Lorsque vous effectuez une conversion vers des types de données date et heure, SQL Server rejette toutes les valeurs qu'il ne peut identifier 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 (Transact-SQL).

Conversion de types de données datetime2 vers d'autres types de date et d'heure

Le tableau suivant décrit ce qui se produit lorsqu'un type de données datetime2 est converti en d'autres types de données de date et d'heure.

Type de données vers lequel effectuer la conversion

Détails de conversion

date

Le jour, le mois et l'année sont copiés.

Le code suivant montre les résultats de la conversion d'une valeur datetime2(4) en valeur date.

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1234';
DECLARE @date date = @datetime2;
SELECT @datetime2 AS '@datetime2', @date AS 'date';
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

Les heures, les minutes, les secondes et les fractions de seconde sont copiée si l'échelle est la même, ou arrondies à la valeur supérieure si l'échelle est différente.

Le code suivant montre les résultats de la conversion d'une valeur datetime2(4) en valeur time(3).

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1237';
DECLARE @time time(3) = @datetime2;
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)';
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.124
--
--(1 row(s) affected)

datetime

Les valeurs de date et heure sont copiées. Lorsque la précision de fraction de la valeur datetime(n) est supérieure à trois chiffres, la valeur est tronquée en conséquence.

Le code suivant montre les résultats de la conversion d'une valeur datetime2 en valeur datetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:10.1234567'
DECLARE @datetime datetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
@datetime2             @datetime
---------------------- -----------------------
2025-12-10 12:32:10.12 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

La date et les heures sont copiées. Les minutes sont arrondies à la valeur supérieure par rapport aux secondes, et les secondes sont définies à 0.

Le code suivant montre les résultats de la conversion d'une valeur datetime2 en valeur smalldatetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:30.9234567';
DECLARE @smalldatetime smalldatetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime';
--Result
@datetime2             @smalldatetime
---------------------- -----------------------
2025-12-10 12:32:30.92 2025-12-10 12:33:00
(1 row(s) affected)

datetimeoffset(n)

La valeur de datetime2(n) est copiée dans la valeur de datetimeoffset(n). Le décalage de fuseau horaire est défini sur +00:0. Lorsque la précision de la valeur datetime2(n) est supérieure à la précision de la valeur datetimeoffset(n), la valeur est arrondie en conséquence à la valeur supérieure.

Le code suivant montre les résultats de la conversion d'une valeur datetime2(5) en valeur datetimeoffset(3).

D DECLARE @datetime2 datetime2(3) = '12-10-25 12:32:10.12999';
DECLARE @datetimeoffset datetimeoffset(2) = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)';
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
2025-12-10 12:32:10.13           2025-12-10 12:32:10.13 +00:00
--
--(1 row(s) affected)

Conversion de 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 explicites qui ne spécifient pas de style à partir de types de date et d'heure en littéraux de chaîne seront 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 sur le type de données datetime. Toute opération d'affectation de littéraux ODBC DATETIME en des types datetime2 provoque une conversion implicite entre datetime et ce type, comme défini par les règles de conversion.

ODBC TIME

Consultez la règle DATE ODBC précédente.

ODBC DATETIME

Consultez la règle DATE ODBC précédente.

DATE uniquement

La partie TIME a pour valeur par défaut 00:00:00.

TIME uniquement

La partie DATE a pour valeur par défaut 1900-1-1.

TIMEZONE uniquement

Les valeurs par défaut sont fournies.

DATE + TIME

Simple

DATE + TIMEZONE

Non autorisé.

TIME + TIMEZONE

La partie DATE a pour valeur par défaut 1900-1-1. L'entrée TIMEZONE est ignorée.

DATE + TIME + TIMEZONE

Le DATETIME local sera 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 l'ensemble des résultats.

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

Voir aussi

Référence

CAST et CONVERT (Transact-SQL)