Almacenamiento, cálculo y comparación de datos de fecha y hora en Microsoft Access

Resumen

En este artículo se describe cómo Microsoft Access almacena el tipo de datos Date/Time. 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 tiempo
  • Comparar datos de fecha
  • Comparación de datos de tiempo

Más información

Almacenar datos de fecha y hora

Access almacena el tipo de datos Date/Time como un número de punto flotante de precisión doble de 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.D.) y 2.958.465 (31 de diciembre de 9999 D.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. 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 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.
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 Inmediato, presione ENTRAR y, a continuación, observe los resultados:

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

El resultado es igual a: 36298.58333333333

? 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)

Resultado igual: 12/31/1899 9:00:00 AM

? CVDate(-304398.575)

El resultado es igual a: 1/8/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 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 puede mostrar esos valores mediante diferentes formatos:

Valor almacenado (número doble) Formato predeterminado (fecha general) Formato personalizado (mm/dd/aaaa hh:nn:ss A.M./P.M.)
36295.0 5/15/99 15/05/1999 12:00:00 AM
0.546527777777778 1:07 p.m. 12/30/1899 01:07:00 PM
36232.9375 3/13/99 10:30 PM 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 y dar formato a los intervalos de tiempo correctamente, siga estos pasos:

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

    Option Explicit

  2. Escriba el procedimiento siguiente:

    '------------------------------------------------------------------
    '  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 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 fraccionaria. 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 Inmediato, sustituya la fecha actual por 3/31/1999 y, a continuación, presione ENTRAR:

  • Para devolver un valor entero, use 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")

Comparación de datos de tiempo

Al comparar valores de tiempo, es posible que reciba resultados incoherentes porque un 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á un resultado false (0) aunque los dos valores de tiempo sean iguales:

var1 = #2:01:00 PM#

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

? var2 = #2:11:00 PM#

Cuando Access convierte un valor de tiempo 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 generar un resultado false (0) al comparar 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 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 tiempo 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 de hora, vea DateSerial (Función)

Para obtener más información sobre 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 la propiedad de formato : tipo de datos de fecha y hora en el Asistente para Office o el Asistente para respuestas y, a continuación, haga clic en Buscar para ver el tema.