APSQL

[SQL 2008] Travailler aves les dates

Cet article traite uniquement le cas de SQL Serer 2008. Si vous travaillez avec SQL Server 2005, il est préférable de consulter cet article.

Pour gérer les données de type date et heure SQL Server 2008 propose les types de données suivant:

  • datetime2 qui offre plus de précision que le simple type datetime.
  • date qui permet  de stocker uniquement une date (jour, mois et année)  et donc aucune information de type heures, minutes ou secondes.
  • time qui permet de stocker des informations de type heure, minutes, secondes et fraction de secondes avec une précision de 100 nanosecondes.
  • datetimeoffset qui permet de stocker une information date et heure ainsi que le décalage par rapport à l'heure GMT.
  • datetime hérité des versions précédentes de SQL Server, il est préférable de ne pas utiliser ce type de données pour les nouveaux développement
  • smalldatetime peu lourd (4 octets); ce type permet de stocker une information de type date et heure (entre le 1er jenvier 1900 et le 6 juin 2079) avec une précision d'une minute.

Les types datetime2, date, time et datetimeoffset sont introduits avec SQL Server 2008. IL sont à privilégier pour tous nouveaux développemant car il permettent une gestion plus fine des données de type date et heure. Par exemple avec le type date seule les informations année, mois et jour sont conservées. Ainsi non seulement l'information est plus compact, mais en plus de nombreux effet de bords peuvent être évités lorsque les informations de type heure, minutes et secondes sont incorrect. Le travail avec les données de type date et time est facilité et la comparaison deviens plus aisée.

Saisir une date

Il est possible de saisir la date sous forme de chaine de caractère puis de convertir cette chaîne de caractère en données de type datetime. La conversion peut être faite de façon implicite (SET DATEFORMAT) ou bien de façon explicite avec la fonction CONVERT. Dans tous les cas il ne faut pas oublier que le format ISO8601 permet de travailler efficacemement avec des informations représentant les dates et heures

SET DATEFORMAT

Avec cette instruction, il est possible de définir son propre format de date pour la session en cours. L'instruction SET DATEFORMAT ne concerne que les saisies de dates

SET DATEFORMAT formatDate;

Le format de date permet de savoir dans quel ordre sont fournies les valeurs jour (d), mois (m) et année (y).

exemple set dateformat

CONVERT

La fonction convert, lorsqu'elle est utilisée pour manipuler des dates, accepte 3 paramètres qui sont: le type de destination, l'expression à convertir et le format de date. Pour saisir une date au format jj/mm/aaaa il faut utiliser le style 103 ou bien le style 3 si on se contente d'une année saisie sur 2 chiffres simplement.

exemple convert

Afficher une date

Pour afficher une date et heure, il est nécessaire de convertir les informations au format texte. Cette opération est effectuée de façon implicite par le paramètre de langue ou bien dateformat (s'il à été précisé). Il est possible de réaliser cette opération de conversion de façon explicite avec la fonction CONVERT. Il est également possible de faire appel à la fonction DATENAME pour afficher la date à un format spécifique.

Dans l'exemple suivant, la date et heure courant est affichée au format par défaut.

format par défaut

La fonction CONVERT est utilisée pour convertir la date et heure courante de façon explicite en chaine de caractère en respectant un format prédéfini.

convert format 113

La fonction DATENAME accepte 2 arguments : la partie de la date à extraire et l'information de type datetime avec laquelle travailler.
DATENAME(élémentDeDate, donnéeDeTypeDatetime)
Les éléments de dates sont codés de la façon suivante

Elément Abréviation
année yy, yyyy
trimestre qq, q
mois mm, m
jour dans l'année dy, y
jour dd,d
semaine wk, ww
jour de la semaine dw
heures hh
minutes mi, n
secondes ss, s
millisecondes ms

La fonction DATEPART fonctionne de façon similaire mais va retourner un nombre entier au lieu d'une chaine de caractères.

Dans l'exemple suivant l'année de la date courante est affichée.

Exemple Datename

Tableau récapitulatif des diffénrents type

typeOctetsPrecisionMiniMaxitest
datetime2(precision)6 à 8 octets suivant la précision100 nanosecondes01/01/000131/12/9999select CONVERT (datetime2,getdate());
datetimeoffset(precision)10 octets100 nanosecondes
avec un délallage horaire compris entre -14h et +14h
01/01/000131/12/9999select CONVERT (datetimeoffset,getdate());
date3 octets1 jour01/01/000131/12/9999select CONVERT (date,getdate());
time5 octets100 nanosecondes00:00:00.000000023:59:59.9999999select CONVERT (time,getdate());
datetime8 octetsArrondi à 0, 3 et 7 millème de seconde01/01/175331/12/9999select CONVERT (datetime,getdate());
smalldatetime4 octets1 minute01/01/190006/06/2079select CONVERT (smalldatetime,getdate());

Manipuler les informations de type date et heure

Pour manipuler les informations contenues dans des colonnes de type datetime et smalldatetime SQL Server proposent différentes fonctions Transact SQL.

  • DATEADD : Ajouter à un date un nombre de minutes, d'heures, de jours, ....
  • DATEDIFF : Ecart entre deux dates en repectant l'unité de mesure (année, mois, jour, heures, ...)
  • DATENAME : Extraire une partie de la date au format caractère
  • DATEPART : Extraire une partie de la date au format numérique
  • DAY : Pour obtenir le numéro du jour dans le mois (équivallent à datepart(d, ...))
  • MONTH : Pour obtenir le numéro du mois dans l'année
  • YEAR : Pour obtenir le numéro de l'année
  • GETDATE : Date et heure du système
  • GETUTCDATE: Date et heure UTC (Greenwich) cal

Pour en savoir plus article MSDN sur l' utilisation des données de type date et heure.