He usado función para calcular la antigüedad de un trabajador en años y meses. Pero no consigo añadir los días
A la función usada y que funciona estupendamente, no he conseguido añadir las instrucciones necesarias para que además de los años y meses, me calcule también los días.
1 Respuesta
Mª Teresa, puedes utilizar esta función:
'-------------------------------------------------------------------------------------------- 'Función para calcular la edad en años y meses, o en días si es menor de un mes 'Por Sveinbjorn '-------------------------------------------------------------------------------------------- Public Function fncEdadDetalle(FechaNac As Date) As String Dim vAño As Double Dim vMes As Double Dim vDia As Double If IsNull(FechaNac) Then fncEdadDetalle = "" Exit Function End If If FechaNac = Date Then fncEdadDetalle = "0 días" Exit Function End If 'Compruebas el mes If Month(FechaNac) > Month(Date) Then vAño = DateDiff("yyyy", FechaNac, Date) - 1 Else vAño = DateDiff("yyyy", FechaNac, Date) End If 'Compruebas el día If Day(FechaNac) > Day(Date) Then vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date) - 1 If vMes < 0 Then vMes = 12 + vMes vAño = vAño - 1 End If Else vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date) End If 'Si es menor de un mes, calculas la edad en días If vAño = 0 And vMes = 0 Then vDia = DateDiff("d", FechaNac, Date) 'Construyes la cadena de la edad If vAño = 1 Then fncEdadDetalle = vAño & " año" ElseIf vAño > 1 Then fncEdadDetalle = vAño & " años" End If If vMes = 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " mes" ElseIf vMes > 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " meses" End If If vDia = 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " día" ElseIf vDia > 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " días" End If End Function
Imagino que ya sabrás cómo va esto: copias la función en un módulo de tu BD, y luego la usas como si fuera una de las que trae el propio Access, ya sea en el código o en una consulta, como origen de un cuadro de texto..., siempre pasándole como parámetro un dato de tipo fecha (la fecha de nacimiento)
Saludos!
Una nueva web y foro de Access, visítanos: http://nksvaccessolutions.com/
Si, he ubicado la función en un módulo y he llamado a éste en el evento de un campo fecha. En mi caso, [fecha de baja laboral], porque necesito saber que si por ejemplo se comienza la baja el 25/02/2016; a fecha de hoy, el período de baja es de 2 meses y 6 días.
Una vez aplicada la función, el resultado que me da es : 2 meses
Perdona, que te pegué una función que no era. La anterior sólo calcula los días si la edad es menor de un mes...
Ésta es la correcta:
'-------------------------------------------------------------------------------------------- ' Función para calcular la diferencia entre fechas en años, meses y días ' Por Sveinbjorn '-------------------------------------------------------------------------------------------- Public Function fncDiferenciaFechas(ByVal laFechaIni As Date) As String Dim vAño As Double Dim vMes As Double Dim vDia As Double Dim laFechaFin As Date Dim temp As Date 'Si no se metió la fecha, salimos sin más If IsNull(laFechaIni) Then fncDiferenciaFechas = "" Exit Function End If laFechaFin=Date '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
Hola! Tal y como comenté, la función es perfecta y su resultado lo he dejado en un campo texto.
De forma que puedo tener: 1 año, 6 meses y 5 días; 6 meses y 1 día; 4 meses y 24 días; 1 mes y 3 días,etc....
Por favor:
¿Cómo podría, mediante consulta, obtener todos los registros menores o iguales a 6 meses?
Muchas gracias por vuestra amabilidad
Con esa función no puede hacerlo, porque devuelve un valor de tipo texto.
Necesitas una nueva función que te haga el cálculo de la edad en meses, y usarla en la consulta con el criterio que indicas (este nuevo campo lo puedes ocultar para que no se muestre en el resultado de la consulta).
Prueba esta función, a ver si te sirve:
'-------------------------------------------------------------------------------------------- ' Función para calcular la edad en meses ' Por Sveinbjorn '-------------------------------------------------------------------------------------------- Public Function fncEdadMeses(FechaNac As Date) As Integer Dim vMes As Integer If Day(FechaNac) > Day(Date) Then vMes = DateDiff("m", FechaNac, Date) - 1 Else vMes = DateDiff("m", FechaNac, Date) End If fncEdadMeses = vMes End Function
Como te decía, la añades a tu consulta en una nueva columna (oculta o no, como veas) y en criterios le pones el <=6
Saludos!
Una nueva web y foro de Access, pásate: http://nksvaccessolutions.com/
- Compartir respuesta