Mostar años, mes y días entre dos fechas.

Tengo un formulario con dos campos fechas ( FAlta y FBaja), lo que intento hacer es

Calcular los años, meses y días que transcurren entre la dos fechas.

¿Qué función podría usa para conseguir eso?

Si me podrían ayudar u orientar.

2 respuestas

Respuesta
2

Antes de nada déjame decirte que ningún ordenador trabaja con fechas, trabaja con números. Al día 01/01/1900 le asignaron el 1, al 02/01/1900 el 2, así hasta el día de hoy que andamos por el 43050(¡Cómo pasa el tiempo!). Lo mismo que las horas, que son decimales de dia. Luego se aplican cálculos y se presentan como lo ves

Dicho esto, si tienes una fecha inicio y una fecha final como en la imagen

Si aprieto el botón

De los 16 años sobran 270 días(los decimales son por las horas), que son los que se transforman en meses y días. Por si te sirve el código del botón es

Respuesta
1

Antonio: Hay bastante ayuda en la red de ese tema.

Mira por ejemplo:

https://www.lawebdelprogramador.com/foros/Access/1187854-Calcular-edad-con-anos-meses-y-dias.html 

N saludo >> Jacinto

En primer lugar, gracias por responder tanto a Jacinto como a Icue Gonzalez, decir que antes de realizar la pregunta estuve mirando por la red y todo lo que había era muy enrevesado o daban error. En cuanto a la función que me pasa Icue la he realizado pero me daba error incluso me salía la fecha (años) en negativo.

He encontrado una respuesta que dio Sveinbjorn El Rojo el 11 de Julio de 2013, he intentado adaptarla, pero no doy con el resultado, me podríais decir que  tendría que cambiar para adaptarla mejor. Por ejemplo inserto la siguiente fecha y me da el siguiente resultado: Fecha alta: 01/01/17 y Fecha Baja: 11/11/17 me da como resultado: 10 meses; o si inserto 26/11/13

25/11/16 me da como resultado: 3 años y -1 meses y 0  dia

  La función era para calcular la antigüedad de un trabajador en años y meses

Public Function fncAntiguedad(FechaAlta As Date, FechaBaja As Date) As String

Dim vAño As Double

Dim vMes As Double

Dim vDia As Double

If IsNull(FechaAlta) Or IsNull(FechaBaja) Then fncAntiguedad = "": Exit Function

If Month(FechaAlta) > Month(FechaBaja) Then

vAño = DateDiff("yyyy", FechaAlta, FechaBaja) - 1

Else

vAño = DateDiff("yyyy", FechaAlta, FechaBaja)

End If

If Day(FechaAlta) > Day(FechaBaja) Then

vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaAlta), FechaBaja) - 1

Else

vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaAlta), FechaBaja)

End If

Select Case vAño

Case 0

Select Case vMes

Case 0

vDia = DateDiff("d", FechaAlta, FechaBaja)

fncAntiguedad = vDia & IIf(vDia = 1, " día", " días ")

Case 1

fncAntiguedad = vMes & " mes"

Case Else

fncAntiguedad = vMes & " meses "

End Select

Case 1

Select Case vMes

Case 0

fncAntiguedad = vAño & " año"

Case 1

fncAntiguedad = vAño & " año y " & vMes & " mes y " & vDia & " dia"

Case Else

fncAntiguedad = vAño & " año y " & vMes & " meses y " & vDia & " dia"

End Select

Case Else

Select Case vMes

Case 0

fncAntiguedad = vAño & " años"

Case 1

fncAntiguedad = vAño & " años y " & vMes & " mes y " & vDia & " dia"

Case Else

fncAntiguedad = vAño & " años y " & vMes & " meses y " & vDia & " dia"

End Select

End Select

End Function

Antonio: En alguna ocasión yo he usado en una consulta, el código siguiente, que por su estilo creo que pertenece a Neckkito o Sveinbjorn.

'Función para calcular diferencias entre fechas en años, meses y días >> Casi seguro que es de Neckkito o Sveinbjorn
Public Function FncDiferenciaFechas(ByVal LaFechaIni As Date, ByVal LaFechaFin As Date) As String 'Esta funciona perfecto
'A) En una consulta: Añades una nueva columna y le pones: DiferenciaFechas: FncDiferenciaFechas ([Fecha1];[Fecha2]) >> Fecha1 es la mas ANTIGUA
'B) En un TExtBox independiente en tu Formulario/Informe:
'Una opción sería ponerle la misma expresión en el origen del control del cuadro.
'Otra opción sería que muestre la diferencia al poner las Fechas, en cuyo caso en el evento AfterUpdate de tus Campos Fecha1 y Fecha2, les generas este código:
'If Not IsNull(Me.Fecha1) And Not IsNull(Me.Fecha2) Then
        'Me.Diferencia = FncDiferenciaFechas(Me.Fecha1, Me.Fecha2)
'Else
        'MsgBox "Un mensaje"
'End If
'Y le pondrás el mismo código al evento Al Activar Registro del Formulario.
'Obviamente tendrás que cambiar Fecha1, Fecha2 y Diferencia por los Nombres que tú tengas a tus campos/Controles
Dim vAño As Double
Dim vMes As Double
Dim vDia As Double
Dim Temp As Date
'Si no se metió alguna de las dos fechas, salimos sin más
If IsNull(LaFechaIni) Or IsNull(LaFechaFin) Then
        FncDiferenciaFechas = ""
        Exit Function
End If
'Comprobamos que la fecha inicial sea más antigua que la final
If LaFechaIni > LaFechaFin Then
        Temp = LaFechaIni
        LaFechaIni = LaFechaFin
        LaFechaFin = Temp
ElseIf LaFechaIni = LaFechaFin Then 'Si las dos fechas son la misma
        FncDiferenciaFechas = "0 días"
        Exit Function
End If
'Calculas la diferencia en años
If Month(LaFechaIni) > Month(LaFechaFin) Then
        vAño = DateDiff("yyyy", LaFechaIni, LaFechaFin) - 1
Else
        vAño = DateDiff("yyyy", LaFechaIni, LaFechaFin)
End If
'Calculas la diferencia en meses
If Day(LaFechaIni) > Day(LaFechaFin) Then
        vMes = DateDiff("m", DateAdd("yyyy", vAño, LaFechaIni), LaFechaFin) - 1
        If vMes < 0 Then
                vMes = 12 + vMes
                vAño = vAño - 1
        End If
Else
        vMes = DateDiff("m", DateAdd("yyyy", vAño, LaFechaIni), LaFechaFin)
End If
'Calculas la diferencia en días
vDia = DateDiff("d", DateAdd("m", vAño * 12 + vMes, LaFechaIni), LaFechaFin) ' Mod 7
'Construyes la expresión
If vAño = 1 Then
        FncDiferenciaFechas = vAño & " año"
ElseIf vAño > 1 Then
        FncDiferenciaFechas = vAño & " años"
End If
If vMes = 1 Then
        FncDiferenciaFechas = IIf(FncDiferenciaFechas = "", "", FncDiferenciaFechas & " y ") & vMes & " mes"
ElseIf vMes > 1 Then
        FncDiferenciaFechas = IIf(FncDiferenciaFechas = "", "", FncDiferenciaFechas & " y ") & vMes & " meses"
End If
If vDia = 1 Then
        FncDiferenciaFechas = IIf(FncDiferenciaFechas = "", "", FncDiferenciaFechas & " y ") & vDia & " día"
ElseIf vDia > 1 Then
        FncDiferenciaFechas = IIf(FncDiferenciaFechas = "", "", FncDiferenciaFechas & " y ") & vDia & " días"
End If
End Function  'FncDiferenciaFechas(ByVal laFechaIni As Date, ByVal laFechaFin As Date) As String

Incluso creo que los comentarios del código vienen de Origen, pero no tengo el origen de donde lo saqué. Si alguno de los dos lee ésto quizá nos lo digan. Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas