Cómo almacenar, calcular y comparar datos de fecha y hora en Microsoft Access

Nota

Office 365 ProPlus pasa a llamarse Microsoft 365 Apps para empresas. Para obtener más información sobre este cambio, lea esta publicación de blog.

Resumen

En este artículo se describe cómo Microsoft Access almacena el tipo de datos Fecha y hora. En este artículo también se describe por qué puede recibir resultados inesperados al calcular fechas y horas o comparar fechas y horas.

En este artículo se describen los siguientes temas:

  • Datos de fecha y hora de almacenamiento
  • Dar formato a un campo Fecha y hora
  • Calcular datos de tiempo
  • Comparar datos de fecha
  • Comparar datos de hora

Más información

Datos de fecha y hora de almacenamiento

Access almacena el tipo de datos Date/Time 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 -657.434 (1 de enero de 100 d.C.) y 2.958.465 (31 de diciembre de 9999 d.C.). 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. Puede convertir el valor numérico en horas, en minutos y en segundos multiplicando el valor numérico por 24.

En la tabla siguiente se muestra cómo Access almacena los valores de fecha y hora:

Número doble Parte fecha Fecha real Parte de tiempo 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.
36836.125 36836 6 de noviembre de 2000 .125 3:00:00 a.m.

Para ver cómo Access almacena valores de fecha y hora como números, escriba los siguientes comandos en la ventana Inmediato, presione ENTRAR y, a continuación, observe los resultados:

? CDbl(#5/18/1999 14:00:00#)

El resultado es igual a: 36298.583333333

? CDbl(#12/14/1849 17:32:00#)

El resultado es igual a: -18278.730555556

Para ver la fecha y la hora de los valores numéricos, escriba los siguientes comandos en la ventana Inmediato, presione ENTRAR y, a continuación, observe los resultados:

? CVDate(1.375)

El resultado es igual a: 12/31/1899 9:00:00 AM

? CVDate(-304398.575)

El resultado es igual a: 8/1/1066 1:48:00 PM

Dar formato a un campo Fecha y hora

Puede dar formato a un valor de fecha y hora para mostrar una fecha, una hora o ambos. Cuando se usa un formato de solo fecha, Access almacena un valor de 0 para la parte de hora. Cuando se usa un formato de solo hora, Access almacena un valor de 0 para la parte de fecha.

En la tabla siguiente se muestra cómo Access almacena los valores de fecha y hora. En la tabla siguiente también se muestra cómo se pueden mostrar esos valores mediante diferentes formatos:

Valor almacenado (número doble) Formato predeterminado (fecha general) Formato personalizado (mm/dd/yyyy hh:nn:ss A.M./P.M.)
36295.0 5/15/99 05/15/1999 12:00:00 AM
0.546527777777778 1:07 p.m. 12/30/1899 01:07:00 PM
36232.9375 3/13/99 10:30PM 03/13/1999 10:30:00 PM

Nota El formato predeterminado de un valor de fecha y hora es Fecha general. Si un valor es de solo fecha, no aparece ninguna hora. Si el valor es de solo hora, no aparece ninguna fecha.

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 evitar este comportamiento, puede crear una función definida por el usuario para asegurarse de que los intervalos de tiempo tienen el formato correcto.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas. Para calcular correctamente y dar formato a los intervalos de tiempo, siga estos pasos:

  1. Cree un módulo y, a continuación, escriba la siguiente línea en la sección Declaraciones si la siguiente línea aún no está ahí:

    Option Explicit

  2. Escriba el siguiente procedimiento:

    '------------------------------------------------------------------
    '  This function calculates the elapsed time between two values and then
    '  formats the result in four different ways.
    '
    '  The function accepts interval arguments such as the following:
    '
    '     #5/12/95 6:00:00AM# - #5/11/95 10:00:00PM#
    '
    '
    '
    '     [End Time]-[Start Time]
    '------------------------------------------------------------------
    
    Function ElapsedTime (Interval)
      Dim x
      x = Int(CSng(Interval * 24 * 3600)) & " Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _
         & " Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _
         & " Hours:Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _
         & " Hours " & Format(Interval, "nn") & " Minutes " & _
         Format(Interval, "ss") & " Seconds"
      Debug.Print x
    
    End Function
    
  3. Escriba la siguiente línea en la ventana Inmediato y, a continuación, presione ENTRAR:

    ? ElapsedTime(#6/1/1999 8:23:00PM#-#6/1/1999 8:12:12AM#)

Observe que aparecen los siguientes valores:

43848 Seconds
730:48 Minutes:Seconds
12:10:48 Hours:Minutes:Seconds
0 days 12 Hours 10 Minutes 48 Seconds

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á un resultado False incluso si la fecha de hoy es 3/31/1999:

? Now()=DateValue("3/31/1999")

La función Now() devuelve un número de precisión doble que representa la fecha actual y la hora actual. Sin embargo, la función DateValue() devuelve un número entero que representa la fecha, pero no un valor de hora fraccional. Por lo tanto, Now() es igual a DateValue() solo cuando Now() devuelve un tiempo de 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, escriba la función en la ventana Inmediato, sustituya la fecha actual por 3/31/1999 y presione ENTRAR:

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

    ? Date()=DateValue("3/31/1999")

  • Para quitar la parte fraccional de la función Now(), use la función Int():

    ? Int(Now())=DateValue("3/31/1999")

Comparar datos de hora

Al comparar valores de tiempo, es posible que reciba resultados incoherentes porque un valor de hora se almacena como la parte fraccional de un número de punto flotante de precisión doble. Por ejemplo, si escribe la siguiente expresión en la ventana Inmediato, recibirá un resultado false (0) aunque los dos valores de tiempo tienen el mismo aspecto:

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 idéntico al valor de hora. La pequeña diferencia causada por el cálculo es suficiente para producir un resultado false (0) cuando se compara un valor almacenado con un valor constante.

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

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

var1 = #1/1/99 2:01:00 PM #

var2 = DateAdd("n", 10, var1)

? var2 = #1/1/99 2:11:00 PM #

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

var1 = #2:01:00 PM #

var2 = DateAdd("n", 10, var1)

? CStr(var2) = CStr(#2:11:00 PM#)

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

var1 = #2:01:00 PM #

var2 = DateAdd("n", 10, var1)

? DateDiff("s", var2, #2:11:00 PM#) = 0

Referencias

Para obtener más información sobre el cálculo de valores de fecha y valores de hora, vea Función DateSerial

Para obtener más información sobre cómo dar formato a los tipos de datos fecha y hora, haga clic en Ayuda de Microsoft Access en el menú Ayuda, escriba la propiedad format - tipo de datos de fecha y hora en el Asistente para Office o en el Asistente para respuestas y, a continuación, haga clic en Buscar para ver el tema.