Funciones para calcular y para mostrar los valores de fecha y hora en Access

Seleccione idioma Seleccione idioma
Id. de artículo: 210604 - Ver los productos a los que se aplica este artículo
Moderado: requiere conocimientos básicos de macros, código e interoperabilidad.

Expandir todo | Contraer todo

En esta página

Resumen

Dado que un valor de fecha y hora se almacena como un número de doble precisión, puede recibir resultados con formato incorrecto al intentar tratar estos valores en una expresión. En este artículo se demuestra cómo crear expresiones y funciones personalizadas para mostrar fechas específicas y calcular intervalos de horas.

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. En este artículo se da por supuesto que ya conoce el lenguaje de programación que se muestra, así como las herramientas empleadas 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.

Más información

Mostrar fechas concretas

Para mostrar fechas concretas, puede utilizar la función DateSerial() para tratar el día, el mes y el año de una fecha. Por ejemplo, puede utilizar las expresiones siguientes en la propiedad ControlSource de un cuadro de texto o en la ventana Inmediata para devolver fechas concretas:
  • El mes actual:
    DateSerial(Year(Date()), Month(Date()), 1)
  • El mes siguiente:
    DateSerial(Year(Date()), Month(Date()) + 1, 1)
  • El último día del mes actual:
    DateSerial(Year(Date()), Month(Date()) + 1, 0)
  • El último día del mes siguiente:
    DateSerial(Year(Date()), Month(Date()) + 2, 0)
  • El primer día del mes anterior:
    DateSerial(Year(Date()), Month(Date())-1,1)
  • El último día del mes anterior:
    DateSerial(Year(Date()), Month(Date()),0)
  • El primer día del trimestre actual:
    DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 1, 1)
  • El último día del trimestre actual:
    DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 4, 0)
  • El primer día de la semana actual (suponiendo que el domingo es el primer día):
    Date() - WeekDay(Date()) + 1
  • El último día de la semana actual:
    Date() - WeekDay(Date()) + 7
  • El primer día de la semana actual (con la configuración del cuadro de diálogo Opciones):
    Date() - WeekDay(Date(), 0) + 1
  • El último día de la semana actual:
    Date() - WeekDay(Date(), 0) + 7
Para obtener más información acerca de cómo calcular el año fiscal del mes fiscal, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
210249 Cómo obtener el mes o el año fiscal de una fecha determinada en Access 2000
PRECAUCIÓN: si sigue los pasos de este ejemplo, modificará la base de datos de ejemplo Neptuno.mdb. Quizás desee hacer copia de seguridad del archivo Neptuno.mdb y seguir estos pasos en una copia de la base de datos.

Calcular intervalos de tiempo

Dado que un valor de hora se almacena como una fracción de un día de 24 horas, puede recibir los resultados en un formato incorrecto al intentar sumar, restar, multiplicar o dividir datos de hora mayores de 24 horas.

Por ejemplo, si intenta encontrar el número de horas transcurrido entre dos fechas restando los valores en Visual Basic, puede que se devuelva un número incorrecto. Para demostrar esto, escriba el código siguiente en la ventana Inmediata y observe que se devuelve el valor 0:00 horas en lugar del valor correcto 53:00 horas:
   StartDate=#6/1/93 8:00AM#
   EndDate=#6/3/93 1:00PM#
   ?Format(EndDate-StartDate,"hh:mm")

Para resolver problemas de formato producidos por valores de hora mayores de 24 horas, puede utilizar las funciones Int() y CSng() en Visual Basic para separar un valor de hora calculado en variables diferentes para los días, horas, minutos y segundos. Por ejemplo, puede incluir el fragmento de código siguiente en una función personalizada para crear variables de hora independientes:
 '-------------------------------------------------------------------
 ' This sample code separates a time interval into seven variables for
 ' the following values: days, hours, minutes, seconds, total time in
 ' hours, total time in minutes, and total time in seconds.
 '
 ' The interval argument is flexible; it can be a single value, an
 ' expression, or a field reference.
 '-------------------------------------------------------------------

 Dim totalhours As Long, totalminutes As Long, totalseconds As Long
 Dim days As Long, hours As Long, minutes As Long, seconds As Long
 Dim interval As Variant

 days = Int(CSng(interval))
 totalhours = Int(CSng(interval * 24))
 totalminutes = Int(CSng(interval * 1440))
 totalseconds = Int(CSng(interval * 86400))
 hours = totalhours Mod 24
 minutes = totalminutes Mod 60
 seconds = totalseconds Mod 60

Puede utilizar las variables totalhours, totalminutes y totalseconds para mostrar un valor de hora como una única unidad de tiempo. Las variables de días, horas, minutos y segundos le permiten dividir un valor de hora en sus distintas partes. Para mostrar los valores de hora en formatos diferentes, puede concatenar estas variables según se demuestra en las funciones de ejemplo siguientes:
  • La función GetElapsedDays () calcula el tiempo transcurrido entre dos valores de fecha u hora, y muestra el resultado en días.
  • La función GetElapsedTime () calcula el tiempo transcurrido entre los valores de hora y muestra el resultado en días, horas, minutos y segundos.
  • La función GetTimeCardTotal () suma un campo de valores de hora en una tabla y muestra el total en horas y minutos.

Función de ejemplo GetElapsedDays()

Para crear la función GetElapsedDays(), siga estos pasos:
  1. Abra la base de datos de ejemplo Neptuno.mdb.
  2. Cree un módulo nuevo y escriba la línea siguiente en la sección de declaraciones si aún no está:
     Option Explicit
  3. Escriba la siguiente función:
     Function GetElapsedDays (interval)
        Dim days As Long
    
        days = Int(CSng(interval))
        GetElapsedDays = days & " Days "
     End Function
  4. Para probar esta función, cree una consulta nueva basada en la tabla Orders.
  5. En la cuadrícula QBE, agregue los campos siguientes:
        Campo: ShippedDate
        Mostrar: True
    
        Campo: OrderDate
        Mostrar: True
    
        Campo: ElapsedTime: GetElapsedDays([ShippedDate]-[OrderDate])
        Mostrar: True
  6. Ejecute la consulta. Tenga en cuenta que la columna ElapsedTime muestra el número de días entre el campo ShippedDate y el campo OrderDate para cada registro de la tabla Orders.

Función de ejemplo GetElapsedTime()

Para crear la función GetElapsedTime(), siga estos pasos:
  1. Cree una tabla nueva con la estructura siguiente y guárdela como TimeLog.
        Tabla: TimeLog
        -----------------------
        Nombre de campo: StartTime
        Tipo de datos: Date/Time
        Formato: General Date
    
        Nombre de campo: EndTime
        Tipo de datos: Date/Time
        Formato: General Date
  2. Vea la tabla TimeLog en la vista Hoja de datos, escriba los tres registros siguientes y, a continuación, cierre la tabla:
        StartTime                 EndTime
        --------------------------------------------
        5/10/95 4:57:00  PM       5/15/95 2:38:00 AM
        5/11/95 10:17:31 AM       5/24/95 6:05:00 PM
        5/18/95 9:16:43  AM       5/19/95 5:03:00 PM
  3. Cree un módulo y escriba la línea siguiente en la sección de declaraciones:
     Option Explicit
  4. Escriba la función siguiente:
     Function GetElapsedTime(interval)
    
     Dim totalhours As Long, totalminutes As Long, totalseconds As _
         Long
     Dim days As Long, hours As Long, Minutes As Long, Seconds As Long
    
     days = Int(CSng(interval))
     totalhours = Int(CSng(interval * 24))
     totalminutes = Int(CSng(interval * 1440))
     totalseconds = Int(CSng(interval * 86400))
     hours = totalhours Mod 24
     Minutes = totalminutes Mod 60
     Seconds = totalseconds Mod 60
    
     GetElapsedTime = days & " Days " & hours & " Hours " & Minutes & _
     " Minutes " & Seconds & " Seconds "
    
     End Function

    NOTA: la función GetElapsedTime requiere que se le pase una fecha y una hora.
  5. Para probar esta función, cree un nuevo informe basado en la tabla TimeLog utilizando el Asistente para informes automáticos.
  6. Vea el informe en la vista Diseño.
  7. Agregue un cuadro de texto independiente a la sección de detalles de la tabla TimeLog y establezca sus propiedades como sigue:
        Textbox
        ---------------
        Name: ElapsedTime
        ControlSource: =GetElapsedTime([EndTime]-[StartTime])
        Width: 3 pulgadas
  8. Vea el informe. Observe que cada registro muestra el tiempo total transcurrido en días, horas, minutos y segundos.

Función de ejemplo GetTimeCardTotal()

Para crear la función GetTimeCardTotal(), siga estos pasos:

NOTA: el código de ejemplo de este artículo utiliza Microsoft Data Access Objects. Para que este código se ejecute correctamente, debe hacer referencia a la Biblioteca de objetos de Microsoft DAO 3.6. Para ello, haga clic en Referencias en el menú Herramientas del Editor de Visual Basic y asegúrese de que la casilla Biblioteca de objetos de Microsoft DAO 3.6 está activada.

  1. Cree una tabla nueva con la estructura siguiente y guárdela como TimeCard.
        Tabla: TimeCard
        -----------------------
        Nombre de campo: Daily Hours
        Tipo de datos: Date/Time
        Formato: Short Time
  2. Vea la tabla TimeCard en la vista Hoja de datos, escriba los cuatro registros siguientes y, a continuación, cierre la tabla:
        8:15
        7:37
        8:12
        8:03
  3. Cree un módulo nuevo y escriba la línea siguiente en la sección de declaraciones si aún no está:
     Option Explicit
  4. Escriba la siguiente función:
     Function GetTimeCardTotal ()
    
     Dim db As DAO.Database, rs As DAO.Recordset
     Dim totalhours As Long, totalminutes As Long
     Dim days As Long, hours As Long, minutes As Long
     Dim interval As Variant, j As Integer
    
     Set db = dbengine.workspaces(0).databases(0)
     Set rs = db.OpenRecordset("timecard")
     interval = #12:00:00 AM#
        While Not rs.EOF
           interval = interval + rs![Daily hours]
           rs.MoveNext
        Wend
     totalhours = Int(CSng(interval * 24))
     totalminutes = Int(CSng(interval * 1440))
     hours = totalhours Mod 24
     minutes = totalminutes Mod 60
    
     GetTimeCardTotal = totalhours & " hours and " & minutes & " minutes"
    
     End Function
  5. Para probar esta función, escriba la línea siguiente en la ventana Inmediata y, a continuación, presione ENTRAR:
     ?GetTimeCardTotal()

    Observe que la ventana Inmediata muestra 32 horas y 7 minutos.

Referencias

Para obtener más información acerca de cómo calcular valores de fecha y hora, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
210276 Almacenar, calcular y comparar datos de fecha y hora

Propiedades

Id. de artículo: 210604 - Última revisión: martes, 22 de mayo de 2007 - Versión: 5.1
La información de este artículo se refiere a:
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
Palabras clave: 
kbhowto kbprogramming KB210604

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com