Cómo calcular diferencia entre fecha ingreso y fecha egreso, en año,meses,días?

La fecha de egreso debe ser fija, no me sirve la función date, no debe ser automática.

2 respuestas

Respuesta
1

¿Cómo quiere la presentación? Por ejemplo, 2 años, 3 meses y 5 días

Le preparé este ejemplo:

TABLA

DISEÑO CONSULTA

RESULTADO DE LA CONSULTA

Otra forma más exacta con esta función. Pegue esta función en un módulo y la puede llamar desde cualquier parte.

Public Function fncDiFechas(ByVal FechaIni As Date, ByVal FechaFin As Date) As String
    Dim vAño As Double
    Dim vMes As Double
    Dim vDia As Double
    Rem Dim FechaFin As Date
    Dim temp As Date
    'Si no se metió la fecha, salimos sin más
    If IsNull(FechaIni) Or IsNull(FechaFin) Then
        fncDiFechas = ""
        Exit Function
    End If
    'Comprobamos que la fecha inicial sea más antigua que la final
    If FechaIni > FechaFin Then
        temp = FechaIni
        FechaIni = FechaFin
        FechaFin = temp
    ElseIf FechaIni = FechaFin Then 'Si las dos fechas son la misma
        fncDiFechas = "0 días"
        Exit Function
    End If
    'Calculas la diferencia en años
    If Month(FechaIni) > Month(FechaFin) Then
        vAño = DateDiff("yyyy", FechaIni, FechaFin) - 1
    Else
        vAño = DateDiff("yyyy", FechaIni, FechaFin)
    End If
    'Calculas la diferencia en meses
    If day(FechaIni) > day(FechaFin) Then
        vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaIni), FechaFin) - 1
        If vMes < 0 Then
            vMes = 12 + vMes
            vAño = vAño - 1
        End If
    Else
        vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaIni), FechaFin)
    End If
    'Calculas la diferencia en días
    vDia = DateDiff("d", DateAdd("m", vAño * 12 + vMes, FechaIni), FechaFin) ' Mod 7
    'Construyes la expresión
    If vAño = 1 Then
        fncDiFechas = vAño & " año"
    ElseIf vAño > 1 Then
        fncDiFechas = vAño & " años"
    End If
    If vMes = 1 Then
        fncDiFechas = IIf(fncDiFechas = "", "", fncDiFechas & ", ") & vMes & " mes"
    ElseIf vMes > 1 Then
        fncDiFechas = IIf(fncDiFechas = "", "", fncDiFechas & ", ") & vMes & " meses"
    End If
    If vDia = 1 Then
        fncDiFechas = IIf(fncDiFechas = "", "", fncDiFechas & " y ") & vDia & " día"
    ElseIf vDia > 1 Then
        fncDiFechas = IIf(fncDiFechas = "", "", fncDiFechas & " y ") & vDia & " días"
    End If
End Function

El ejemplo que le dan si lo prueba no es exacto, por ejemplo si calcula la diferencia:

01/02/2020 y 01/03/2020 (año bisiesto) le da 29 días, pero se requiere es 1 mes.

Con la función que le suministro al llamarla desde la ventana de inmediato obtenemos:

?fncDiFechas("01/02/2020","01/03/2020")

1 mes.

Como puede ver en la consulta el empleado OLGA PEREZ solo laboró 1 mes.

Hola mil gracias, voy a realizar la prueba mañana, si estoy pretendiendo que me arroje años, meses y días

Eduardo me funcionó muy bien, pero quise usarla nuevamente cambiando el nombre del campo en Reingreso y Egresofinal y colocándolo en Módulo2, como una segunda fórmula y me arrojo el siguiente error "La expresión contiene un nombre ambiguo......" Lo solucione eliminando el módulo 2, pero ese cálculo también lo necesito; tendrás alguna solución? Gracias 

No necesita más módulos la función la puede llamar desde cualquier parte. NO desde modificar nada en la función. Si puede suba una imagen donde la quiere aplicar y miro que puedo hacer

Eduardo, pero la función aplica sobre 2 campos con el nombre "Fechaini" y "Fechafin", yo quiero aplicarlo sobre otros "Reingreso" y "Egresofinal"; solamente modifique los nombre de los campos, y es cuando me tira el error (es obvio que me estoy equivocando)

Vuelvo y le comento no tiene que ver nada el nombre de los campos y no debe cambiar nada en la función, independiente del nombre entonces en que sea campos fecha, por ejemplo puede llamar la función así:

FncDiFechas(Reingreso, Egresofinal)

Esto si la llama desde una consulta, ahora si la llama desde un procedimiento, sería algo como:

Me.Tiempo=fncDiFecha(Me.Reingreso, Me.Egresofinal)

En donde  Me.Tiempo, Me.Reingreso y Me.EgresoFinal son los nombres de campos del formulario

Respuesta
1

Puedes hacerlo de muchas formas, depende de como tengas construido el formulario. Por ejemplo, si tengo un empleado

Puedes ver que el cursor está en el control FechaBaja. Cuando pulso Enter

En este caso, pero ya te digo que depende de como lo tengas tu, el código del evento Despuérs de actualizar del control FechaBaja es

Private Sub FechaBaja_AfterUpdate()
Dim AñosF As Integer, MesesF As Integer, DiasF As Integer, RestoDias As Integer
AñosF = Fix((FechaBaja - FechaAlta) / 365.2425)
RestoDias = FechaBaja - FechaAlta - Int(AñosF * 365.2425)
MesesF = Int([RestoDias] / 30.3)
DiasF = Int(((RestoDias / 30.3) - Int(RestoDias / 30.3)) * 30.3)
Antiguedad = AñosF & " años, " & MesesF & " meses y " & DiasF & " días"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas