Calculer le temps écoulé

Cette rubrique explique comment Access stocke le type de données Date/Heure et pourquoi vous pouvez obtenir des résultats inattendus lorsque vous comparez des dates et des heures.

Stocker des données de date/heure

Access stocke les données de type Date/Heure sous forme de nombre de double précision à virgule flottante (jusqu'à 15 décimales). La partie entière du nombre de double précision représente la date, la partie décimale, quant à elle, représente l'heure.

Les valeurs de date valides vont de -647 434 (1er janvier 100, A.D.) à 2 958 465 (31 décembre 9999, AD). La valeur de date 0 représente le 30 décembre 1899. Access stocke les dates antérieures au 30 décembre 1899 sous forme de nombres négatifs.

Les valeurs d'heure correctes sont comprises entre .0 (00:00:00) et .99999 (23:59:59). La valeur numérique représente une fraction d'une journée. Vous pouvez convertir la valeur numérique en heures, minutes et secondes en multipliant la valeur numérique par 24.

Nombre double Partie date Date réelle Partie temps Heure réelle
1.0 1 31 décembre 1899 0,0 00:00:00.
2,5 2 1er janvier 1900 0,5 12:00:00.
27468,96875 27468 15 mars 1975 0,96875 23:15:00.
33914,125 33914 6 novembre 1992

Calculer les données de temps

Étant donné qu'une valeur d'heure est stockée en tant que fraction d'une journée de 24 heures, vous pouvez obtenir des résultats incorrects de mise en forme lorsque vous calculez des intervalles de temps supérieurs à 24 heures. Pour éviter ce problème, vous pouvez créer votre propre fonction pour que les intervalles de temps soient correctement mis en forme.

La procédure suivante montre comment utiliser la fonction Format pour mettre en forme les intervalles de temps. La procédure accepte deux valeurs d'heure et affiche, dans différents formats, l'intervalle entre elles dans la fenêtre Exécution.

Function ElapsedTime(endTime As Date, startTime As Date) 
    Dim strOutput As String 
    Dim Interval As Date 
     
    ' Calculate the time interval. 
    Interval = endTime - startTime 
  
    ' Format and print the time interval in seconds. 
    strOutput = Int(CSng(Interval * 24 * 3600)) & " Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in minutes and seconds. 
    strOutput = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _ 
        & " Minutes:Seconds" 
    Debug.Print strOutput 
     
    ' Format and print the time interval in hours, minutes and seconds. 
    strOutput = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _ 
           & " Hours:Minutes:Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in days, hours, minutes and seconds. 
    strOutput = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _ 
        & " Hours " & Format(Interval, "nn") & " Minutes " & _ 
        Format(Interval, "ss") & " Seconds" 
    Debug.Print strOutput 
 
End Function

Comparer les données de date

Étant donné que les dates et les heures sont stockées ensemble en tant que nombres de double précision, il peut arriver que vous obteniez des résultats inattendus lorsque vous comparez des données Date/Heure. Par exemple, si vous tapez l'expression suivante dans la fenêtre Exécution, vous obtenez un résultat faux (0) même si la date du jour est 11/07/2006 :

? Now()=DateValue("7/11/2006")

La fonction Now retourne un nombre de double précision représentant la date et l’heure actuelles. Cependant, la fonction DateValue renvoie un nombre entier représentant la date mais pas une valeur d'heure fractionnelle. Par conséquent, la fonction Now ne produit une valeur égale à celle de la fonction DateValue que si Now renvoie 00:00:00 (12:00:00 A.M.).

Pour obtenir des résultats précis lorsque vous comparez des valeurs de date, utilisez une des fonctions suivantes. Pour tester chaque fonction, tapez celle-ci dans la fenêtre Exécution, remplacez 11/07/2006 par la date actuelle, puis appuyez sur Entrée :

Pour renvoyer une valeur entière, utilisez la fonction Date :

?Date()=DateValue("7/11/2006")

Pour supprimer la partie fractionnaire de la fonction Now , utilisez la fonction Int :

?Int(Now())=DateValue("7/11/2006")

Comparer les données de temps

Lorsque vous comparez des valeurs d'heure, il peut arriver que vous obteniez des résultats incohérents, car une valeur d'heure est stockée en tant que partie fractionnelle d'un nombre de double précision à virgule flottante. Par exemple, si vous tapez l'expression suivante dans la fenêtre Exécution, vous obtenez un résultat faux (0) même si les deux valeurs d'heure semblent identiques :

var1 = #2:01:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #2:11:00 PM# 

Lorsqu’Access convertit une valeur d’heure en fraction, le résultat calculé peut être l’équivalent exact de la valeur d’heure. La petite différence produite par le calcul est suffisante pour produire un résultat faux (0) lorsque vous comparez une valeur stockée à une valeur constante.

Pour obtenir des résultats précis lorsque vous comparez des valeurs d'heure, utilisez une des méthodes suivantes. Pour tester chaque méthode, tapez celle-ci dans la fenêtre Exécution, puis appuyez sur Entrée :

Ajoutez une date associée à la comparaison d'heures :

var1 = #7/11/2006 2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #7/11/2006 2:10:00 PM#

Convertissez les valeurs d'heure en données de type String avant de les comparer :

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? CStr(var2) = CStr(#2:10:00 PM#)

Utilisez la fonction DateDiff pour comparer des unités précises telles que les secondes :

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? DateDiff("s", var2, #2:10:00 PM#) = 0

À propos des collaborateurs

Lien fourni par l’icônede membre de la communauté UtterAccess .

UtterAccess est le forum d’aide et wiki de Microsoft Access de référence.

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.