Compartir a través de


Calcular el tiempo transcurrido

En este tema se explica cómo almacena Access el tipo de datos de fecha y hora y por qué se pueden recibir resultados inesperados al calcular o comparar las fechas y las horas.

Almacenar datos de fecha y hora

Access almacena el tipo de datos de fecha y hora como un número de punto flotante de precisión doble (hasta 15 posiciones decimales). La parte entera del número de precisión doble representa la fecha; la parte decimal representa la hora.

Los valores de fecha válidos oscilan entre -647.434 (1 de enero de 100, A.D.) y 2.958.465 (31 de diciembre de 9999, A.D.). El valor de fecha 0 representa el 30 diciembre de 1899. Access almacena las fechas anteriores al 30 de diciembre de 1899 como números negativos.

Los valores de hora válidos oscilan entre ,0 (00:00:00) y ,99999 (23:59:59). Los valores numéricos representan una fracción de un día. Dichos valores se pueden convertir en horas, minutos y segundos multiplicando por 24 el valor numérico.

Número doble Parte de fecha Fecha real Parte de la hora Tiempo real
1.0 1 31 de diciembre de 1899 ,0 12:00:00 a.m.
2,5 2 1 de enero de 1900 ,5 12:00:00 p.m.
27468,96875 27468 15 de enero de 1975 ,96875 11:15:00 p.m.
33914,125 33914 6 de noviembre de 1992

Calcular datos de tiempo

Dado que el valor de hora se almacena como fracción de un día de 24 horas, es posible que los resultados de formato que reciba sean incorrectos cuando calcule intervalos de tiempo mayores que 24 horas. Para solucionar este problema, puede crear una función definida por el usuario para asegurarse de que los intervalos de tiempo tengan el formato correcto.

El procedimiento siguiente ilustra la manera de usar la función Format para dar formato a los intervalos de tiempo. Dicho procedimiento acepta dos valores de hora e imprime el intervalo existente entre ellos en la ventana Inmediato en varios formatos diferentes.

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

Comparar datos de fecha

Dado que las fechas y las horas se almacenan juntas como números de precisión doble, es posible que reciba resultados inesperados cuando compare datos de fecha y hora. Por ejemplo, si escribe la siguiente expresión en la ventana Inmediato, recibirá el resultado False (0) aun cuando la fecha de hoy sea 11/07/2006:

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

La función Now devuelve un número de precisión doble que representa la fecha y hora actuales. Sin embargo, la función DateValue devuelve un número entero que representa la fecha pero no un valor de hora fraccionario. En consecuencia, Now sólo será igual a DateValue cuando Now devuelva la hora 00:00:00 (12:00:00 a.m.).

Para recibir resultados precisos al comparar valores de fecha, utilice una de las funciones siguientes. Para probar cada función, escríbala en la ventana Inmediato, utilice la fecha actual en lugar de 7/11/2006 y, a continuación, presione ENTRAR:

Para devolver un valor entero, use la función Date :

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

Para quitar la parte fraccionaria de la función Now , use la función Int :

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

Comparación de datos de tiempo

Cuando compare valores de hora, es posible que los resultados que reciba sean incoherentes, ya que el valor de hora se almacena como parte fraccionaria de un número de punto flotante de precisión doble. Por ejemplo, si escribe la siguiente expresión en la ventana Inmediato, recibirá el resultado False (0) aunque los dos valores de hora parezcan iguales:

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

Cuando Access convierte un valor de hora en una fracción, es posible que el resultado calculado no sea el equivalente exacto del valor de hora. La pequeña diferencia causada por el cálculo es suficiente para producir un resultado False (0) al comparar un valor almacenado con un valor de constante.

Para recibir resultados precisos al comparar valores de hora, utilice uno de los métodos siguientes. Para probar cada método, escríbalo en la ventana Inmediato y, a continuación, presione ENTRAR:

Agregue una fecha asociada a la comparación de horas:

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

Convierta los valores de hora en tipos de datos String antes de compararlos:

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

Use la función DateDiff para comparar unidades precisas, como segundos:

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

Información sobre los colaboradores

Vínculo proporcionado porCommunity Member Icon (Icono de miembro de la comunidad) de la comunidad utterAccess .

UtterAccess es el principal foro de ayuda y wiki de Microsoft Access.

Vea también

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.