Partager via


Données de date et d'heure dans SQL Server 2008 (ADO.NET)

Mise à jour : November 2007

SQL Server 2008 introduit de nouveaux types de manipulation de données de date et d'heure. Ces nouveaux types de données incluent des types distincts pour la date et l'heure, ainsi que des types de données étendus prenant en charge une plage plus vaste de valeurs, la précision et les 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 n'incluaient que deux types de données pour l'utilisation des valeurs de date et d'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. Par ailleurs, ces types de données prennent uniquement en charge les dates postérieures à l'introduction du calendrier grégorien en Angleterre en 1753. En outre, ces anciens types de données sont incompatibles avec les fuseaux horaires, ce qui rend difficile la gestion de données provenant de différents fuseaux horaires.

Une documentation complète sur les types de données SQL Server est disponible dans la documentation en ligne de SQL Server. Le tableau suivant répertorie les rubriques de base spécifiques à la version relatives aux données de date et d'heure.

SQL Server 2000

SQL Server 2005

SQL Server 2008

Données datetime et smalldatetime (en anglais)

Utilisation des données de date et d'heure

Utilisation des données 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 d'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 le  janvier 1900. La taille de stockage est égale à 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 présente une plage comprise 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 3 et 6 octets selon la précision spécifiée.

datetime2

Le type de données datetime2 combine la plage et la précision des types de données date et time en un seul type de données.

Les valeurs par défaut et les formats littéraux de chaîne sont identiques à 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 correspond à 2 chiffres situés entre 00 et 24 qui représentent le nombre d'heures de décalage horaire. MM correspond à 2 chiffres situés entre 00 et 59 qui représentent le nombre de minutes supplémentaires dans le décalage horaire. Les formats d'heure sont pris en charge jusqu'à une précision de 100 nanosecondes. Le signe + ou  - obligatoire indique si le décalage est ajouté ou soustrait de l'heure universelle UTC (Universal Time Coordinate ou heure de Greenwich) pour obtenir l'heure locale.

Remarque :

Si le Type System Version n'est pas défini explicitement sur SQL Server 2008 ou Latest dans la chaîne de connexion, les valeurs datetime seront traitées en utilisant le système de type SQL Server 2005 par défaut. Pour plus d'informations sur l'utilisation des mots clés de version du système de type, consultez Nouvelles fonctionnalités de SQL Server 2008 (ADO.NET).

Format et ordre de la date

La façon dont SQL Server analyse les valeurs de date et d'heure dépend non seulement de la version du système de type et de celle du serveur, mais également des paramètres de format et de langue par défaut du serveur. Les chaînes de date fonctionnant pour les formats de date d'une langue peuvent ne pas être reconnues si la requête est exécutée par une connexion qui utilise une autre langue ou une autre définition des formats de date.

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 SET DATEFORMAT Transact-SQL sur une connexion pour lever l'ambiguïté pour des valeurs de date en classant les parties de date dans l'ordre MDY, DMY, YMD, YDM, MYD ou DYM.

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' serait interprétée sous la forme MDY (2 janvier 2003) sur un serveur dont le paramètre de langue est Anglais États-Unis, et sous la forme DMY (1er février 2003) sur un serveur dont le paramètre de langue est Anglais britannique. L'année est déterminée en utilisant la règle de l'année de troncature de SQL Server, qui définit la date de troncature pour l'assignation de la valeur relative au siècle. Pour plus d'informations, consultez Option two digit year cutoff dans la documentation en ligne de SQL Server.

Remarque :

Le format de date YDM 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 dans la documentation en ligne de SQL Server 2008.

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

Vous pouvez spécifier le type de données d'un objet SqlParameter à l'aide de l'une des énumérations SqlDbType. Les énumérations suivantes ont été ajoutées à l'objet SqlDbType pour prendre en charge les nouveaux types de données de date et d'heure.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

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 type de données System.Data.SqlTypes nouveau n'a été introduit pour prendre en charge les nouveaux types de données de date et d'heure. Le tableau suivant décrit les mappages entre les types de données de date et d'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

Time

Time

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 SqlParameter pertinentes pour les types de données de date et d'heure.

Propriété

Description

IsNullable

Obtient ou définit si une valeur peut être nulle. Lorsque vous envoyez une valeur de paramètre null au serveur, vous devez spécifier DBNull, plutôt que null (Nothing dans Visual Basic). Pour plus d'informations sur les valeurs Null de base de données, consultez Gestion des valeurs null (ADO.NET).

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 d'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 d'heure

Value

Obtient ou définit la valeur de paramètre.

SqlValue

Obtient ou définit la valeur de paramètre.

Remarque :

Les valeurs d'heure inférieures à zéro ou égales ou supérieures à 24 heures lèvent une exception 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 paramètre existant.

Les sections suivantes présentées dans cette rubrique fournissent des exemples montrant comment spécifier des paramètres de date et d'heure. Pour plus d'exemples sur l'utilisation des paramètres, consultez Configuration des paramètres et des types de données de paramètre (ADO.NET) et Paramètres de DataAdapter (ADO.NET).

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 à la fois les parties de date et d'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 horaire de 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 entrer des paramètres à l'aide de la méthode AddWithValue d'un objet SqlCommand, comme indiqué dans le fragment de code suivant. Cependant, la méthode AddWithValue ne vous permet pas de spécifier DbType ni 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. Lors de l'utilisation de nouveaux types de données datetime, vous devez affecter explicitement le type de données de l'instance à la propriété SqlDbType du paramètre. L'utilisation de Variant ou la fourniture implicite de valeurs de paramètre peut provoquer des problèmes de compatibilité descendante avec les types de données datetime et smalldatetime.

Le tableau suivant indique les SqlDbTypes déduits selon les types CLR :

Type CLR

Inferred SqlDbType

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

Retourne le type correspondant au type spécifique au fournisseur sous-jacent pour le champ. Retourne les mêmes types que GetFieldType pour les nouveaux types de date et d'heure.

GetProviderSpecificValue

Récupère la valeur de la colonne spécifiée. Retourne 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 sous forme d'objet SqlString. Un objet InvalidCastException est généré si les données ne peuvent pas être exprimées sous la forme d'un SqlString.

GetSqlValue

Récupère des données de colonne comme son SqlDbType par défaut. Retourne 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 2000 ou SQL Server 2005. Un objet InvalidCastException est généré 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 la colonne spécifiée comme son type CLR sous-jacent.

GetValues

Récupère les valeurs de colonne dans un tableau.

GetSchemaTable

Retourne un objet DataTable qui décrit les métadonnées du jeu de résultats.

Remarque :

Les nouveaux SqlDbTypes de date et d'heure ne sont pas pris en charge pour le code exécuté en mode in-process dans SQL Server. Une exception est levée si l'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 d'heure en utilisant de nombreux formats littéraux de chaîne différents que SQL Server évalue ensuite lors de l'exécution, en les convertissant en structures de date/heure internes. SQL Server reconnaît les données de date et d'heure entre des guillemets simples ('). Les exemples suivants présentent certains formats :

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

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

  • Formats de chaîne non séparée, tels que '20061015' qui serait interprété sous la forme « 15 octobre 2006 » si vous utilisez le format de date ISO standard.

Remarque :

La documentation complète relative à l'ensemble des formats littéraux de chaîne et autres fonctionnalités des types de données de date et d'heure est disponible dans la documentation en ligne de SQL Server.

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

Ressources dans la documentation en ligne de SQL Server 2008.

Pour plus d'informations sur l'utilisation des valeurs de date et d'heure dans SQL Server 2008, consultez les ressources suivantes dans la documentation en ligne de SQL Server 2008.

Rubrique

Description

Types de données et fonctions de date et d'heure (Transact-SQL)

Fournit une vue d'ensemble des 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 types de données et les fonctions de date et d'heure, ainsi que des exemples sur leur utilisation.

Types de données (Transact-SQL)

Décrit les types de données système dans SQL Server 2008.

Voir aussi

Concepts

Mappages de types de données SQL Server (ADO.NET)

Configuration des paramètres et des types de données de paramètre (ADO.NET)

Autres ressources

Types de données SQL Server et ADO.NET