Les dates et le type DATETIME sous SQL Server

Sujet maintes fois abordé pour un problème de format, la gestion des dates sous SQL Server est pourtant très simple si l’on se sert, comme d’habitude, des standards …

Très souvent on demande comment faire pour afficher une date sous tel ou tel format, ou encore pourquoi en stockant une date sous tel format, Enterprise Manager ou SQL Server Management Studio les affichent sous la forme AAAA-MM-JJ hh:mm:ss.

Il faut d’abord savoir comment sont stockées les données de type DATETIME : deux entiers, chacun de 4 octets :
Рun entier pour la date elle-m̻me
– un entier pour les heures/minutes/secondes/millisecondes.

Ceci explique pourquoi, lorsqu’on écrit :

1
2
SELECT maDate , maDate - 1 AS hier
FROM dbo.Table

les valeurs contenues dans la colonne « hier » sont plus vieilles d’exactement un jour par rapport à la colonne maDate.

Passons maintenant aux divers format proposés par la fonction CONVERT() : cette fonction permet de choisir un style d’affichage, mais en aucun cas il ne spécifie une date.

C’est pourquoi on peut utiliser la fonction CONVERT() pour obtenir une date à partir d’une chaîne de caractères, et inversement, en spécifiant le style de la chaîne qui représente une date

=>SELECT CONVERT(DATETIME, '26/06/2006', 103)

affiche 2006-06-26 00:00:00.000 sous SQL Server Management Studio ou Enterprise Manager, mais là encore ce n’est qu’une représentation de la date.

Nous avons du spécifier que le format de la chaîne à convertir est le 103, c’est à dire le format français, avec des slashes pour séparer les parties d’une date, et une année sur 4 chiffres (sinon c’est le style « 3 », pour spécifier une année sur deux chiffres).

Inversement :

=>SELECT CONVERT(CHAR(10), GETDATE(), 103)

La fonction GETDATE() retourne la date courante en utilisant le type de données DATETIME (donc deux entiers de 4 octets).
L’exécution de cette dernière requête retourne 26/06/2009.

——————–
— Normalisation —
——————–

Supposons que nous avons totalement normalisé tous les échanges de données entre nos applications et la base de données.
Nous utilisons donc le format ISO, c’est à dire AAAAMMJJ, que SQL Server sait transformer au type DATETIME, directement avec la fonction CAST, qui permet de s’affranchir de tout format de date :

=>SELECT CAST('20090626' AS DATETIME)

affiche bien 2009-06-26 00:00:00.000 sous SQL Server Management Studio ou Enterprise Manager

De même si nous voulons en plus préciser l’heure :

=>SELECT CAST('20090626 22:14:03.257' AS DATETIME)

affiche 2009-06-26 22:14:03.257 sous SQL Server Management Studio ou Enterprise Manager

Dès lors dans le cas d’une application internationalisée, l’application peut communiquer des dates au format ISO, et les afficher suivant le format de la nationalité de l’utilisateur.

ElSuket

Laisser un commentaire