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 almacena Microsoft Access el tipo de datos de 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 temas siguientes:

  • Almacenar datos de fecha y hora
  • Dar formato a un campo de fecha y hora
  • Calcular datos de hora
  • Comparar datos de fecha
  • Comparar datos de hora

Más información

Almacenar datos de fecha y hora

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

Los valores de fecha válidos van de-657.434 (1 de enero de 100 D.C.) a 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, minutos y segundos multiplicando el valor numérico por 24.

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

Número doble Parte de la 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.
36836,125 36836 6 de noviembre de 2000 .125 3:00:00 A.M.

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

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

Resultado igual a: 36298.5833333333

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

Resultado igual a:-18278.7305555556

Para ver la fecha y la hora de los valores numéricos, escriba los siguientes comandos en la ventana ejecución, 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)

Resultado igual a: 8/1/1066 1:48:00 PM

Dar formato a un campo de fecha y hora

Puede dar formato a un valor de fecha y hora para mostrar una fecha, una hora o ambas. 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 sólo tiempo, Access almacena un valor de 0 para la parte de fecha.

En la tabla siguiente se muestra cómo almacena Access los valores de fecha y hora. En la siguiente tabla también se muestra cómo puede mostrar esos valores usando 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 A.M.
0.546527777777778 1:07 PM 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 la fecha general. Si un valor es solo de fecha, no aparece la hora. Si el valor es solo de tiempo, no aparece ninguna fecha.

Calcular datos de hora

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 tengan 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 de declaraciones si la siguiente línea no está ya allí:

    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 línea siguiente 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 valores siguientes:

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

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

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

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

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

  • Para quitar la parte fraccionaria de la función Now (), use la función int ():

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

Comparar datos de hora

Cuando se comparan valores de tiempo, es posible que se obtengan resultados incoherentes, ya que un valor de Time se almacena como parte fraccionaria de un número de punto flotante de doble precisión. Por ejemplo, si escribe la siguiente expresión en la ventana inmediato, recibirá un resultado falso (0), aunque los dos valores de hora tengan 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 tiempo. La diferencia pequeña causada por el cálculo es suficiente para producir un resultado falso (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 String 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 exactas, como segundos:

Var1 = #2:01:00 PM #

Var2 = DateAdd ("n", 10, Var1)

? DifFecha ("s", Var2, #2:11:00 PM #) = 0

Referencias

Para obtener más información acerca de cómo calcular valores de fecha y hora, vea función DateSerial

Para obtener más información acerca de cómo dar formato a los tipos de datos de fecha y hora, haga clic en ayuda de Microsoft Access en el menú ayuda , escriba Format Property-Date/Time Type en el ayudante de Office o en el Asistente para ayuda y, a continuación, haga clic en Buscar para ver el tema.