Données de date et d'heure

SQL Server 2008 introduit de nouveaux types de données pour gérer les informations de date et d’heure. Les nouveaux types de données incluent des types distincts pour la date et l’heure, ainsi que des types de données étendus avec une plus grande plage, une meilleure précision et la prise en compte des fuseaux horaires. À partir du .NET Framework version 3.5 Service Pack (SP) 1, le fournisseur de données .NET Framework pour SQL Server (System.Data.SqlClient) assure la prise en charge complète de l’ensemble des nouvelles fonctionnalités du moteur de base de données SQL Server 2008. Vous devez installer le .NET Framework 3.5 SP1 (ou version ultérieure) pour utiliser ces nouvelles fonctionnalités avec SqlClient.

Les versions de SQL Server antérieures à SQL Server 2008 avaient uniquement deux types de données pour travailler avec des valeurs de date et heure : datetime et smalldatetime. Ces deux types de données contiennent à la fois les valeurs de date et d’heure, ce qui rend difficile l’utilisation de l’une sans l’autre. De plus, seules les dates postérieures à l'introduction du calendrier grégorien en Angleterre en 1753 sont prises en charge par ces types. Une autre limitation est que ces types de données plus anciens ne prennent pas en charge les fuseaux horaires, ce qui rend difficile l’utilisation de données provenant de plusieurs fuseaux horaires.

Pour plus d'informations sur les types de données de date et d’heure dans SQL Server, consultez Types de données et fonctions de date et d’heure.

Types de données de date et d'heure introduits dans SQL Server 2008

Le tableau suivant décrit les nouveaux types de données de date et heure.

Type de données SQL Server Description
date Le type de données date est situé dans une plage comprise entre le 1er janvier 01 et le 31 décembre 9999, avec une précision d’un jour. La valeur par défaut est 1er janvier 1900. La taille de stockage est de 3 octets.
time Le type de données time stocke les valeurs d’heure uniquement en fonction d’une horloge au format 24 heures. Le type de données time est compris entre 00:00:00.0000000 et 23:59:59.9999999 avec une précision de 100 nanosecondes. La valeur par défaut est 00:00:00.0000000 (minuit). Le type de données time prend en charge une précision à la fraction de seconde, et la taille de stockage varie entre trois et six octets, en fonction de la précision spécifiée.
datetime2 Le type de données datetime2 associe la plage et la précision des types de données date et time en un seul type.

Les valeurs par défaut et les formats de littéral de chaîne sont les mêmes que ceux définis dans les types de données date et time.
datetimeoffset Le type de données datetimeoffset présente toutes les fonctionnalités du type de données datetime2 avec en plus un décalage horaire. Le décalage horaire est représenté sous la forme [+|-] HH:MM. HH est un nombre à deux chiffres, compris entre 00 et 14, qui représente le nombre d’heures dans le décalage de fuseau horaire. MM est un nombre à deux chiffres, compris entre 00 et 59, qui représente le nombre de minutes supplémentaires dans le décalage de fuseau horaire. Les formats d’heure sont pris en charge jusqu’à une précision de 100 nanosecondes. Le signe obligatoire + ou- indique si le décalage de fuseau horaire est ajouté ou soustrait à l’heure UTC (temps universel coordonné, ou heure moyenne de Greenwich) pour obtenir l’heure locale.

Notes

Pour plus d’informations sur l’utilisation du mot clé Type System Version, consultez ConnectionString.

Format et ordre de la date

La façon dont SQL Server analyse les valeurs de date et heure dépend non seulement de la version du système de type et de la version du serveur, mais également des paramètres de format et de langue par défaut du serveur. Une chaîne de date qui fonctionne pour les formats de date d’une langue peut ne pas être reconnaissable si la requête est exécutée par une connexion qui utilise des paramètres de format de date et de langue différents.

L’instruction Transact-SQL SET LANGUAGE définit implicitement le DATEFORMAT qui détermine l’ordre des parties de la date. Vous pouvez utiliser l’instruction Transact-SQL SET DATEFORMAT sur une connexion pour lever l’ambiguïté des valeurs de date en classant les parties de la date dans l’ordre MJA, JMA, AMJ, AJM, MAJ ou JAM.

Si vous ne spécifiez pas de DATEFORMAT pour la connexion, SQL Server utilise la langue par défaut associée à la connexion. Par exemple, une chaîne de date « 01/02/03 » est interprétée comme MJA (2 janvier 2003) sur un serveur avec un paramètre de langue Anglais des États-Unis, et comme JMA (1er février 2003) sur un serveur dont le paramètre de langue est Anglais britannique. L’année est déterminée à l’aide de la règle d’année de troncature de SQL Server, qui définit la date de troncature pour l’affectation de la valeur de siècle. Pour plus d’informations, consultez Option two digit year cutoff.

Notes

Le format de date AJM n’est pas pris en charge lors de la conversion d’un format de chaîne en date, time, datetime2 ou datetimeoffset.

Pour plus d’informations sur la manière dont SQL Server interprète les données de date et d’heure, consultez Utilisation des donnée de date et d’heure.

Types de données et paramètres de date/heure

Les énumérations suivantes ont été ajoutées à SqlDbType pour prendre en charge les nouveaux types de données de date et heure.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

Vous pouvez spécifier le type de données d’un objet SqlParameter à l’aide de l’une des énumérations SqlDbType précédentes.

Notes

Vous ne pouvez pas définir la propriété DbType d’un SqlParameter sur SqlDbType.Date.

Vous pouvez également spécifier le type d’un objet SqlParameter de manière générique en attribuant à la propriété DbType d’un objet SqlParameter une valeur d’énumération DbType particulière. Les valeurs d’énumération suivantes ont été ajoutées à l’objet DbType pour prendre en charge les types de données datetime2 et datetimeoffset :

  • DbType.DateTime2

  • DbType.DateTimeOffset

Ces nouvelles énumérations complètent les énumérations Date, Time et DateTime qui existaient dans les versions antérieures du .NET Framework.

Le type de fournisseur de données .NET Framework d'un objet paramètre est déduit du type .NET Framework de la valeur de l'objet paramètre, ou du DbType de l'objet paramètre. Aucun nouveau type de données System.Data.SqlTypes n’a été introduit pour prendre en charge les nouveaux types de données de date et heure. Le tableau suivant décrit les mappages entre les types de données de date et heure SQL Server 2008 et les types de données CLR.

Type de données SQL Server Type .NET Framework System.Data.SqlDbType System.Data.DbType
Date System.DateTime Date Date
time System.TimeSpan Temps Temps
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
DATETIME System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

Propriétés SqlParameter

Le tableau suivant décrit les propriétés de SqlParameter qui sont pertinentes pour les types de données de date et heure.

Propriété Description
IsNullable Obtient ou définit une valeur indiquant si une valeur peut accepter la valeur null. Lorsque vous envoyez une valeur de paramètre null au serveur, vous devez spécifier DBNull plutôt que null (Nothing en Visual Basic). Pour plus d’informations sur les valeurs Null de base de données, consultez Handling Null Values.
Precision Obtient ou définit le nombre maximal de chiffres utilisés pour représenter la valeur. Ce paramètre est ignoré pour les types de données de date et heure.
Scale Obtient ou définit le nombre de décimales à laquelle la partie heure de la valeur est résolue pour Time, DateTime2, et DateTimeOffset. La valeur par défaut est 0, ce qui signifie que l’échelle réelle est déduite de la valeur et envoyée au serveur.
Size Ignoré pour les types de données de date et heure.
Value Obtient ou définit la valeur du paramètre.
SqlValue Obtient ou définit la valeur du paramètre.

Notes

Les valeurs d’heure inférieures à zéro ou supérieures ou égales à 24 heures lèvent une ArgumentException.

Création de paramètres

Vous pouvez créer un objet SqlParameter à l’aide de son constructeur ou en l’ajoutant à une collection SqlCommandParameters en appelant la méthode Add de SqlParameterCollection. La méthode Add prendra comme entrée les arguments de constructeur ou un objet de paramètre existant.

Les sections suivantes de cette rubrique fournissent des exemples de spécification des paramètres de date et heure. Pour obtenir d’autres exemples d’utilisation des paramètres, consultez Configuration des paramètres et des types de données des paramètres et Paramètres DataAdapter.

Exemple relatif au paramètre date

Le fragment de code suivant montre comment spécifier un paramètre date.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@Date";  
parameter.SqlDbType = SqlDbType.Date;  
parameter.Value = "2007/12/1";  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Date"  
parameter.SqlDbType = SqlDbType.Date  
parameter.Value = "2007/12/1"  

Exemple relatif au paramètre time

Le fragment de code suivant montre comment spécifier un paramètre time.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@time";  
parameter.SqlDbType = SqlDbType.Time;  
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Time"  
parameter.SqlDbType = SqlDbType.Time  
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;  

Exemple relatif au paramètre datetime2

Le fragment de code suivant montre comment spécifier un paramètre datetime2 avec les parties date et heure.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@Datetime2";  
parameter.SqlDbType = SqlDbType.DateTime2;  
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Datetime2"  
parameter.SqlDbType = SqlDbType.DateTime2  
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");  

Exemple relatif au paramètre DateTimeOffset

Le fragment de code suivant montre comment spécifier un paramètre DateTimeOffSet avec une date, une heure et un décalage de fuseau horaire égal à 0.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@DateTimeOffSet";  
parameter.SqlDbType = SqlDbType.DateTimeOffSet;  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@DateTimeOffSet"  
parameter.SqlDbType = SqlDbType.DateTimeOffSet  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  

AddWithValue

Vous pouvez également fournir des paramètres à l’aide de la méthode AddWithValue d’une SqlCommand, comme indiqué dans le fragment de code suivant. Toutefois, la méthode AddWithValue ne vous permet pas de spécifier le DbType ou SqlDbType pour le paramètre.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("16660902"));  
command.Parameters.AddWithValue( _  
    "@date", DateTimeOffset.Parse("16660902"))  

Le paramètre @date peut mapper à un type de données date, datetime ou datetime2 sur le serveur. Lorsque vous utilisez les nouveaux types de données datetime, vous devez définir explicitement la propriété SqlDbType du paramètre sur le type de données de l’instance. L’utilisation de Variant ou la spécification implicite de valeurs de paramètres peut entraîner des problèmes de compatibilité descendante avec les types de données datetime et smalldatetime.

Le tableau suivant indique quels SqlDbTypes sont déduits de quels types CLR :

Type CLR SqlDbType déduit
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Récupération des données de date et d'heure

Le tableau suivant décrit les méthodes utilisées pour récupérer des valeurs de date et d’heure SQL Server 2008.

Méthode SqlClient Description
GetDateTime Récupère la valeur de colonne spécifiée sous la forme d’une structure DateTime.
GetDateTimeOffset Récupère la valeur de colonne spécifiée sous la forme d’une structure DateTimeOffset.
GetProviderSpecificFieldType Renvoie le type qui est le type spécifique au fournisseur sous-jacent pour le champ. Renvoie les mêmes types que GetFieldType pour les types de date et d’heure.
GetProviderSpecificValue Récupère la valeur de la colonne spécifiée. Renvoie les mêmes types que GetValue pour les nouveaux types de date et d’heure.
GetProviderSpecificValues Récupère les valeurs dans le tableau spécifié.
GetSqlString Récupère la valeur de colonne en tant que SqlString. Une InvalidCastException se produit si les données ne peuvent pas être exprimées sous la forme d’une chaîne SqlString.
GetSqlValue Récupère les données de colonne comme SqlDbType par défaut. Renvoie les mêmes types que GetValue pour les nouveaux types de date et d’heure.
GetSqlValues Récupère les valeurs dans le tableau spécifié.
GetString Récupère la valeur de colonne sous forme de chaîne si la version de système de type a la valeur SQL Server 2005. Une InvalidCastException se produit si les données ne peuvent pas être exprimées sous la forme d’une chaîne.
GetTimeSpan Récupère la valeur de colonne spécifiée sous la forme d’une structure TimeSpan.
GetValue Récupère la valeur de colonne spécifiée en tant que type CLR sous-jacent.
GetValues Récupère des valeurs de colonne dans un tableau.
GetSchemaTable Retourne un élément DataTable qui décrit les métadonnées du jeu de résultats.

Notes

Les nouveaux SqlDbTypes de date et heure ne sont pas pris en charge pour le code qui s’exécute in-process dans SQL Server. Une exception est levée si un de ces types est passé au serveur.

Spécification des valeurs de date et d'heure en tant que littéraux

Vous pouvez spécifier des types de données de date et heure à l’aide d’un large éventail de formats de chaînes littérales, que SQL Server évalue ensuite au moment de l’exécution, en les convertissant en structures de date/heure internes. SQL Server reconnaît les données de date et heure placées entre guillemets simples ('). Les exemples ci-dessous illustrent certains formats :

  • Formats de date alphabétiques, tels que 'October 15, 2006'.

  • Formats de date numériques, tels que '10/15/2006'.

  • Les formats de chaîne non séparés, par exemple '20061015', qui serait interprété comme le 15 octobre 2006 si vous utilisiez le format de date standard ISO.

Les valeurs d’heure inférieures à zéro ou supérieures ou égales à 24 heures lèvent une ArgumentException.

Ressources de documentation SQL Server

Pour plus d’informations sur l’utilisation des valeurs de date et d’heure dans SQL Server, consultez les articles suivants.

Article Description
Types de données et fonctions de date et d'heure (Transact-SQL) Fournit une vue d’ensemble de tous les types de données et fonctions de date et d’heure Transact-SQL.
Utilisation des données de date et d’heure Fournit des informations sur les fonctions et types de données de date et d’heure, ainsi que des exemples d’utilisation.
Types de données (Transact-SQL) Décrit les types de données système dans SQL Server.

Voir aussi