Leçon 6
 
Les dates et les heures

Dans cette leçon, nous allons apprendre à gérer les dates et les heures.

Nous étudierons donc le type de données Date/Heure, et nous verrons pourquoi les dates et les heures sont mélangées en un seul type de champ.

Nous verrons comment saisir les données temporelles proprement, et nous verrons les interactions possibles avec Excel.

Nous verrons également les limites de ces champs.

 
Sommaire

Ouvrez Formagiciel.accdb, et allez dans T_Client en mode création.

Insertion d'un champ de type Date/Heure

 

Nous allons ajouter la date de naissance de nos clients. Pour ce faire, insérez une nouvelle ligne entre Prenom et Taille.

Ajoutez ensuite le champ DateNaissance, et précisez son type de données en Date/Heure.

Lancez ensuite la table en mode saisie de données.

Icône d'aide à la saisie d'une date

Lorsque vous cliquez dans un champ de type Date/Heure, comme ici chez Steven Spielberg, une petite icône apparaît, sur sa droite :

En cliquant sur ce petit icône, vous faites apparaître un calendrier, avec le mois courant. Dans mon cas, lorsque j'ai écrit ce paragraphe, j'étais le 17 janvier 2012 (c'est pourquoi le chiffre 17 est entouré de rouge).

Si vous baladez votre souris sans cliquer, le chiffre de la date (ici, je me balade au dessus de 4) devient beige. 

Si je veux indiquer la date d'aujourd'hui, je clique sur le chiffre encadré ou sur le bouton

Je peux choisir n'importe quel chiffre du mois de janvier 2012, mais également les derniers jours du mois de décembre 2011 (en gris clair, sous les noms des jours en 2 lettres : ), ou les premiers jours de février 2012 (en bas)

Si je veux choisir une date dans un mois précédent ou suivant, je peux cliquer sur ces deux petites flèches : . Choisissez Aujourd'hui (Votre aujourd'hui à vous : 22.10.2014, pas le mien )

Nous ne sommes pas obligés d'utiliser ce calendrier : nous pouvons saisir directement la date au clavier.

D'ailleurs, comme les dates de naissances sont généralement anciennes, ce serait pénible de cliquer sur les petites flèches bleues !

 

Entrez directement la date de naissance de Michael Jackson : 29.2.58.

Au moment ou vous validez avec ENTER, ou que vous cliquez ailleurs, l'année se complète en 1958..

En l'occurrence, il s'agit de sa date de naissance réelle, mais dans la suite de cette leçon, ne vous formalisez pas si nous entrons des dates complétement fantaisistes

Gestion des années en 2 chiffres

Lorsque vous entrez la date avec l'année sur 2 chiffres au lieu de 4, on peut légitimement avoir un doute : si j'écris 17.5.05, je m'attends à ce qu'il rectifie cette date en 17.5.2005.

A contrario, je m'attends à ce que 28.3.77 devienne 28.3.1977 !!!

Windows décide d'une date-pivot.

Testez : entrez comme date de naissance pour Chaplin : 31.12.29, et 1.1.30 pour Patrick Bruel. regardez le résultat : 100 ans les séparent :

C'est donc entre l'année 29 et 30 que tout se joue !

Si vous aviez écrit l'année 1929 en 4 chiffres, Access l'aurait correctement accepté, heureusement !

Essayez maintenant d'entrer la date de naissance de Max Spielberg : 29.2.53. Vous obtenez une erreur. Avez-vous deviné pourquoi ?

Parce que 1953 ... n'est pas une année bissextile, et le 29 février n'existe tout simplement pas !

C'est extrêmement sympathique de la part d'Access de nous informer de notre erreur.

Excès de souplesse d'Excel

Je profite ici pour faire une critique d'Excel, dans ce sens : Excel est un programme qui vous laisse tellement faire tout ce que vous voulez que vous pouvez générer des erreurs très difficiles à débusquer.

Lancez Excel, et dans la cellule A1, écrivez 28.2.1953, et dans B2 : 29.2.1953. Excel ne vous envoie même pas un message d'avertissement qui vous demande si votre saisie est bien normale... Il se contente d'aligner le 28.2 sur la droite, comme une valeur chiffrée, et le 29.2 sur la gauche, comme du texte !

On peut même parfaire la confusion en demandant à aligner le contenu de A2 sur la droite !

 

Du coup, au moindre calcul sur cette date, nous allons avoir des problèmes... Essayez d'ajouter 7 jours à ces deux dates, comme ceci :

En fait, Excel, tout comme Access, doit définir de manière interne le type de données que chaque cellule contient. Ainsi, lorsque vous entrez 29.2.1953 dans Excel, il se dit : "Tiens, l'utilisateur entre du texte, donc je définis cette cellule en texte, mais par contre, il ne faut pas me demander de faire des calculs avec ça !"

Dans Access, c'est différent ! On doit explicitement préciser le type de données qu'on va utiliser (Texte, Mémo, Numérique, Date/heure, etc.). Access nous donnera donc plus de messages d'erreur, et paraîtra plus "psychorigide" qu'Excel, mais, à contrario, nous aurons moins d'erreurs.

Gestion interne des dates et des heures

Je vous propose une expérience amusante pour illustrer ça. Allez dans Excel.

  • Dans la cellule D1, écrivez 50,et appuyez sur ENTER :
  • Retournez dans D1, et écrivez 25.6.2010, et appuyez sur ENTER :
  • Retournez dans D1, et RE-écrivez 50 : ... Et appuyez sur ENTER :

Qu'est ce que c'est que ça que ce 19 février 1900 ?

C'est le ... 50ème jour depuis le 1er janvier 1900.

Ainsi, ça nous donne une idée de la manière qu'a Excel de gérer les dates : il compte les jours depuis le premier janvier 1900. 

Pour les heures, minutes et secondes, il calcule en fraction de journée. Par exemple, 6 heures du matin, c'est en fait le quart de la journée (parce que 6 X 4 = 24).

Ainsi, par exemple 51.25 représente le 20 février1900 à 6 heures du matin... 365.75 représente le 30 décembre 1900 (1900 est une année bissextile), à 18 heures.

C'est facile à démontrer : Dans Excel, appliquez un format personnalisé jj.mm.aaaa hh:mm (Jour.Mois.Année  Heures:Minutes) à cette cellule, comme illusté sur cette image, et regardez : c'est bien la date prévue qui s'affiche.

Ce qui fait qu'il est impossible pour Excel de comprendre une date antérieure au 1er janvier 1900. Vous pouvez essayer d'entrer 31.12.1899, Excel ne reconnaîtra pas la date.

Par contre, il accepte les dates jusqu'au 31 décembre 9999  !

Access, lui, est plus large : il accepte les dates du premier janvier de l'année cent de notre ère (1.1.100) jusqu'au 31.12.9999.

Différences Access-Excel au niveau des dates

Si vous gérez des personnalités nées avant 1900, leurs dates de naissances seront comprises par Access mais pas par Excel.

Complétez les dates de naissances comme ceci :

Maintenant, nous allons copier cette table dans Excel pour voir comment les dates se transfèrent : nous allons voir le problème posé par 01.01.100. Pour copier la table, cliquez avec le bouton droit de la souris dans l'angle en haut à hauche de votre table T_Client, et choisissez Copier :

Rendez-vous dans Excel, cliquez sur une cellule, par exemple B5, et collez ce que vous venez de copier (par exemple en utilisant le raccourci-clavier CTRL-V)

Et voilà, c'est aussi simple que ça !

La ligne 8 est super-haute, parce que nous avons une remarque très longue, et on aurait d'autres choses à redire sur la présentation, mais ce n'est pas ce qui nous intéresse ici.

Excel a décidé de nous montrer les dates sous la forme 17-Janv-2012 (par exemple)

mais le plus intéressant se trouve chez Max Spielberg, qui est né le 1.1.100 : plein de dièses ###########.

Si vous cliquez sur cette cellule, et que vous ne bougez plus votre souris, vous avez un message spécifique qui vous l'annonce.

De plus, dans la barre de formule, un peu plus haut, vous visualisez la réelle valeur : -657434.

En d'autres mots, le 1.1.100 se situe 657434 jours avant le 1er janvier 1900 .

Formats personnalisés

Revenons à Access. Les dates sont affichées par défaut en style de date abrégée (2 chiffres pour le jour, un point, 2 chiffres pour le mois, un point, 4 chiffres pour l'année). Par exemple : 06.09.2012. On dit aussi : jj.mm.aaaa. Vous vous rappelez un peu plus haut, dans Excel ? On a parlé de ce format personnalisé, on y avait même ajouté hh:mm (heures:minutes).

Mais pourquoi jj.mm.aaaa et pas j.m.aaaa ? En fait 06.09.2012 en format j.m.a donnerait 6.9.12 (Les zéros non significatifs n'apparaissent pas, ainsi que le 20 de 2012).

Mais tout ceci est bien compliqué ! Et ce qui est bizarre, c'est que ce format jj.mm.aaaa n'apparait pas dans la propriété format de DateNaissance :

En fait, si on ne précise rien, le format Date, abrégé est appliqué.

Dans la liste déroulante, on peut le voir :

Maintenant, quand on copie ces dates en Date, abrégé dans Excel, pourquoi deviennent-elle soudainement des format Date, réduit ? ... Je n'en sais rien !

Bref, vous avez donc une panoplie de formats très sympathiques ! Voyez que le Date, complet inclut le nom du jour. Connaissez-vous le nom du jour où vous êtes né ? ... Définissez simplement DateNaissance en date, complet, lancez votre table en mode saisie de données. Si vous avez des ########## partout, c'est simplement parce que votre colonne est trop étroite. Elargissez-là.

et écrivez votre date de naissance chez Edith Piaf. Voilà...

Personnellement, je suis né dimanche 21 février 1965

Formats de dates internationaux

Comme vous le constatez, les formats des dates sont toutes basées sur une vision très française : on met toujours le numéro du jour, puis le mois, et enfin l'année.

En outre, on utilise soit des points soit des tirets. Dans les pays anglo-saxons, on place en général le mois avant le jour, et on utilise des barres obliques / pour séparer les éléments.

31.12.2009 devient alors 12/31/09 par exemple.

On ne peut pas choisir ces formats étrangers de date dans la liste de choix de formats, car c'est directement lié à l'installation de Windows.

Vous pouvez toutefois obliger Windows à vous donner une autre sélection de formats de dates, comme ceci par exemple :

Suivez cette procédure uniquement si vous n'êtes pas satisfait de vos formats de date possibles :

  1. Cliquez sur le bouton Démarrer de Windows
  2. Cliquez sur
  3. Cliquez ici :
  4. Puis ici :

Vous arrivez alors dans cette boîte de dialogue :

Chez moi, à Genève, comme j'ai installé Windows 7 en précisant ma région : Suisse Romand, je me retrouve avec des formats de date et d'heure qui sont généralement utilisés chez moi.

Regardez : le code de Date courte : ce sont ces fameux jj.MM.aaaa dont je vous ai parlé un peu plus haut.

Vous avez la possibilité de préciser un autre format pour Date courte :

En général, on ne touche pas vraiment à cette option.

Et vous pouvez, si par exemple vous travaillez énormément avec des collègues ou des clients Anglo-Saxons, changer les formats de manière plus globale.

Si vous choisissez l'Anglais des
Etats-Unis par exemple,
voici ce que vous verriez comme formats :

Il suffit ensuite de cliquer sur OK pour valider le changement.

Le fait d'effectuer cette opération a une incidence sur l'ensemble de tout votre travail quotidien sur votre PC, pas seulement sous Access, mais aussi dans Excel, Word, et même votre petite horloge en bas à droite de votre écran.

Pour ensuite voir les effets réels sur votre table, comme je vous l'ai montré plus haut, il vous sera nécessaire de fermer complètement Access, et de le rouvrir.

A partir de là, vous faites comme vous voulez, en gardant à l'esprit que je continuerai ce cours en format Français, Suisse.

Mais ce n'est pas tout ! Nous ne sommes pas obligés de choisir dans la liste déroulante des formats proposés, mais nous pouvons directement proposer un format personnalisé avec ces fameux J, M et A (Qui deviennent D, M et Y - Day Month Year en anglais - Oui je sais c'est compliqué...).

 

 

Essayez donc de mettre ce format pour le moins fantaisiste à votre DateNaissance : jjjj jj mm/mmmm, aaaa

Et observez le résultat en mode saisie de données.

Si vous voulez en savoir encore plus,
consultez cette page d'aide de Microsoft
.

Bien. Remettez le format à Date, abrégé.

Un champ de type Date/heure contient une date précise. Si vous connaissez l'année de naissance, mais pas le mois ni le jour, vous ne pouvez pas tout simplement écrire 1965 par exemple (une erreur surgirait).

Création d'un champ de type Heure-Minutes

Il n'est pas possible de préciser les fractions de secondes

Comme je vous l'ai précisé plus haut, les dates sont comptées en nombre de jours depuis le 1er janvier 1900, et les jours sont fractionnés en heures : 1 heure = 1/24ème de journée = 1/24 = 0.071428571 (environ). Mais ce ne sont pas dans ces complications que je voulais vous entraîner !

Je voulais juste vous dire par là que l'on peut également mettre des heures, des minutes et des secondes dans un champ de type Date/Heure.

Créez un nouveau champ HeureArrivee que vous placerez entre Prenom et DateNaissance.

Définissez son format à Heure, abrégé :

Heure, Réduit est une notation sur 12 heures... Pas pratique puisque 7h30 et 19h30 seraient notés tous deux sous la forme 07:30

Heure, complet n'est utile que si nous avons besoin des secondes, ce qui est rare, mais c'est pourtant le format appliqué par défaut si vous ne sélectionnez pas un autre format.

Lancez la table en mode saisie de données, et écrivez 8:45 pour Edith Piaf : tout va bien, c'est transformé en 08:45.

Les heures, minutes et secondes sont séparés par deux points (:). Si vous essayez d'écrire 8h45, vous aurez une erreur, et si vous essayez 8.45, il affichera 00:00.

Avez-vous vu qu'on peut écarter les colonnes des propriétés, comme ceci :

Constatez que vous avez toujours cette petite icone qui vous permet de choisir une date, ce qui est totalement idiot et dangereux dans notre cas. Faisons là-disparaître grâce à la propriété Afficher le sélecteur de dates.

Nombre d'heures supérieur à 24

il n'est pas possible d'entrer une heure supérieure à 24 ! Et pourtant, ça pourrait être utile ! Si vous gérez une entreprise de n'importe quoi, et que vous avez un champ nommé TotalHeureTravail : vous pourriez très bien avoir travaillé 15, 30, ou 65 heures sur le projet.

Dans ce cas, Excel fait bien mieux qu'Access, car il accepte et comprend.
Regardez la différence si je désire entre 26:45 dans Access ou dans Excel :

Excel considère que 26h45, c'est en fait le 1.1.1900 + 2h45 (un peu comme si il y avait d'abord les 24 premières heures du 0 janvier 1900, et qu'on arrivait ensuite au premier janvier 1900, et ainsi de suite).

Par exemple, 50:00, c'est 48h + 2h, nous seront donc le 2 janvier 1900 à 2h du matin.

En cas de besoin de gestion d'heure supérieures à 24, nous seront contraints d'utiliser des astuces de programmation qui dépassent de loin le cadre de cette leçon.

Champs combinés date et heure

Il est possible de combiner dans un seul champ, une date et une heure. 

Vous pourriez gérer une entreprise de travail temporaire, et vous avez besoin du moment précis ou un de vos candidats commence sa mission. Créez un nouveau Champ de type Date/Heure MomentPriseFonction que vous placerez entre Prenom et HeureArrivee. Ne précisez pas de format.

Comme vous n'avez pas précisé de format particulier, Access vous affichera les données comme il lui semble "le plus pertinent".

Voici un tableau récapitulatif que je vous propose de recopier dans votre table :

 

A gauche, ce que vous entrez au clavier, et à droite, ce qu'Access affiche :

 

Les heures, minutes et secondes sont séparées par : - les jours.mois.année par . (Ou /), et on sépare la date des heures avec un espace.

Si vous ne précisez pas l'année, comme dans le cas de Jackson et Max Spielberg, Access vous propose l'année en cours.

On aurait pu penser que choisir Date, général aurait homogénéisé les apparences, mais en fait, ça ne change rien :

Par contre, si vous inscrivez le format personnalisé jj.mm.aaaa hh:mm alors, oui, l'apparence est homogénéisée :

 

Constatez qu'au passage, il a modifié le format personnalisé (jj\.mm\.aaaa hh:nn). Il a rajouté un \ devant chaque point, et remplacé le mm de minutes par nn (sans doute pour éviter la confusion avec le mm de mois)

Mais je n'en sais pas plus...

Lancez la table en mode saisie de données :

Voyez l'étrangeté : Les deux heures (22:45 et 22:45:33) sont considérées comme étant du 30.12.1899 (et même pas le 31.12.1899), ne me demandez pas pourquoi .

le 25.11 s'est donc transformé en 25.11.2012, mais comme aucune heure n'a été définie, Access considère que c'est minuit (00:00 - Le tout début de la journée - pas l'extrême fin).

Utilisation de Valide Si avec Date/Heure

Afin d'éviter qu'on entre n'importe quoi dans ce champ, il faudrait limiter la plage des valeurs possibles grâce à la propriété Valide Si que vous avons vu dans la leçon précédente (5).

On pourrait limiter la plage des dates possibles entre l'an 2000 et 2020.

Allez dans la propriété Valide Si et écrivez Entre 2000 Et 2020 :

Lancez la table en mode saisie de données, et essayez d'entrer, par exemple 27.5.2011 13:40 pour Patrick Bruel :

 

Au moment de valider, vous avez un message d'erreur

Essayez de deviner pourquoi, avant de lire la solution plus bas.

Vous avez trouvé ? ...

C'est parce qu'il ne considère pas qu'il faille entrer une date entre l'année 2000 et 2020, mais qu'il faille plutôt entrer une date située entre 2000 jours et 2020 jours après le 1er janvier 1900...

Eh oui ! C'est ce que vous expliquais plus haut : on a l'impression que ce n'est pas très important, la manière interne qu'à Access de trier les dates, mais dans certains cas, comme celui-ci, ça aide sacrément bien à comprendre ce qui se passe !

En fait, il faut plutôt écrire Entre 1.1.2000 et 31.12.2020 :

Mais ça ne va toujours pas : nous obtenons un autre message d'erreur !

La bonne syntaxe est : Entre #1.1.2000# et #31.12.2020#.

Ces dièses # permettent à Access de contrôler qu'il s'agit bien d'une date.

Maintenant, ça fonctionne. Essayez d'écrire 2.8.1962 dans la date de Patrick Bruel, et vous aurez un message d'errreur :

Mais essayez d'écrire 15.12.2019 22:12, et ça marchera très bien.

Faites en sorte que quand on entre une date invalide, à la place du message d'erreur-système que nous venons de voir, Access nous affiche : "La date et l'heure doivent se situer entre 2000 et 2020."
Nous verrons dans la leçon 8, comment attribuer une valeur par défaut sur une date.

Dans cette leçon, nous avons vu comment gérer les champs de type Date et Heure. Nous avons appris à utiliser le petit icône d'aide à la saisie des dates. Nous avons vu qu'il n'y a pas deux types de champ distincts date et heure parce qu'une date est le comptage des jours depuis le premier janvier 1900, et une heure est un nombre réel entre 0 et 1, qui correspond à la fraction d'une journée de 24 heures. Nous avons vu qu'Access et Excel ne gèrent pas les dates et les heures de manière identique, et qu'Access permet des dates antérieures au premier janvier 1900. Nous avons vu que quand on écrit la date en 2 chiffres, Access comprend bien de quel siècle on parle (1900 ou 2000), et nous avons vus qu'il existe une pléiade de formats d'affichage des dates et des heures, qu'il est possible de gérer également avec le panneau de configuration.

Exercice

L'exercice consiste à créer une base de données vide appelée ExerciceLecon006.accdb.

Vous y créerez une table T_Marathon

Avec les champs suivants :

  • NomEtPrenom
  • DateNaissance
  • DateHeureDepart
  • TempsRealise

Avec les données suivantes, qui doivent s'afficher de cette façon :

Quizz
1. Quelle est la date la plus ancienne possible dans un champ de type Date/Heure ?
1.1.100
31.12.1899
1.1.1900
1.1.1970
2. L'icone par défaut d'aide à la saisie d'une date ($) peut se transformer en icone d'aide à la saisie d'une heure grâce à quelle propriété ?
Afficher le sélecteur de dates : Heures seulement
Assistant de saisie : Date et heure
Afficher le sélecteur de dates : Non
Il n'existe pas d'icone d'aide à la saisie des heures
3. Dans un champ Date/Heure, j'écris : 27.2.40. Access va comprendre :
27.2.40
27.2.140
27.2.1940
27.2.2040
Un message d'erreur va surgir
4. Au niveau interne de votre PC, 18:00 va être interprété comme la valeur suivante :
18
1800
0.18
0.75
75
5. J'ai un champ de type Date/Heure dans lequel j'aimerais saisir 25.1.12 9:32, et que ce soit affiché
mercredi 25 janv. 2012 09:32
Quel format dois-je lui-indiquer ?
jjjj mmm aaaa hh:mm
jj jjjj mmm aaaa hh:mm
jjjj jj mmm aaaa h:mm
jjjj j mmm aaaa hh:mm
j m a h:m
6. Dans un champ de type Date/Heure, je voudrais obliger l'utilisateur à entrer une date située forcément au 20ème siècle. Que dois-je indiquer dans la propriété Valide si ?
Entre 1900 et 1999
Entre #1900 et 1999#
Entre 1.1.1900 et 31.12.1999
Entre #1.1.1900 et 31.12.1999#
Entre #1.1.1900# et #31.12.1999#