Necesito una expresión en access que me de cuantos años, meses y días han transcurrido entre dos fechas

la expresión de diFecha de access me da el resultado parcialmente me da el mismo resultado en años, meses y días. Y requiero que me de cuantos años, mese y días han transcurrido entre dos fechas en el mismo resultado me imagino que habrá que concatenar pero no se como hacerlo me declaro ignorante al respecto.


2 respuestas

Respuesta
2

1º/ En tu BD, inserta un módulo nuevo, y en él pega esta función:

'--------------------------------------------------------------------------------------------
'Función para calcular diferencias entre fechas en años, meses y días
'--------------------------------------------------------------------------------------------
Public Function fncDiferenciaFechas(ByVal laFechaIni As Date, ByVal laFechaFin As Date) As String
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

2º/ Guardas el módulo con el nombre que quieras, por ejemplo mdlDifFechas

3º/ Dependiendo de dónde quieras mostrar la diferencia, harás una de estas opciones:

A) En una consulta: añades una nueva columna y le pones:

DiferenciaFechas: fncDiferenciaFechas ([Fecha1];[Fecha2])

B) En un cuadro de texto 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 meter las fechas, en cuyo caso en el evento Después de actualizar 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)

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.

Te dejo aquí un mini-ejemplo: http://www.filebig.net/files/i5xw2D4mEn 

Si te sirvió la solución propuesta, no te olvides e valorarla.

Excelente amigo mio  funciona muy bien, pero yo tengo un problema tengo que calcularle la diferencia entre dos fecha con una fecha inicial y la fecha Actual utilizando =Fecha() por favor necesito ayuda con esto 

Puedes usarla así:

DiferenciaFechas: fncDiferenciaFechas ([Fecha1];Fecha())

Para que te calcula la diferencia entre el campo Fecha1 y la fecha actual.

Buenos días hermano querido excelente sus respuestas fueron ambas dos excelente, tengo otro caso en una consulta el id es consecutivo pero cuando ordeno la consulta por fecha los registros mantiene el numero de id, lo cual se ve en desorden, necesito que al ordenar por fechas conserven el id, correlativo de menor a mayor

Si el ID es autonumérico, es imposible hacer lo que pides. Si no lo es, abre otro hilo y plantea la pregunta dando más datos, para intentar ayudarte.

entonces como hago para saber el total de los registros ya que la base de datos es en su mayoría solos datos de texto y lo que necesito es para aplicarlo en una relación de personal

No entiendo qué es lo que pretendes. Lo mejor es que abras una nueva pregunta, proporcionando todos los datos posibles, para que así, o yo u otro experto te podamos intentar ayudar.

diseñe una base de datos para el control de ciudadanos privados de libertad  y ya esta funcionando gracias a dios y en parte a ti, elabore un reporte que me da todo los datos que necesito pero necesito que me de la cantidad de ciudadanos privados de libertad que tengo  

Utiliza la función DCount como origen de control de un cuadro de texto en tu informe(en el encabezado o en el pie del informe).

Mira estos enlaces para saber cómo usarla
https://msdn.microsoft.com/es-es/library/office/ff191865%28v=office.15%29.aspx 

y dónde (es igual q DLookUp)

http://www.accessyexcel.com/donde-y-como-utilizar-la-funcion-de-dominio-dlookup/ 

Respuesta
1

'************************************************************************
' Autor: MexMan70
' Fecha: 13/06/2006
' Uso: fnEdad(FechaInicial, FechaFinal)
' Si usas esta funcion, respeta su autoría
'************************************************************************
Public Function fnEdad(fInicio As Date, fFinal As Date) As String
Dim nAños As Integer
Dim nMeses As Integer
Dim nDias As Integer

nAños = Int((fFinal - fInicio) / 365.25)
fInicio = DateAdd("yyyy", nAños, fInicio)
nMeses = Int((fFinal - fInicio) / (365 / 12))
fInicio = DateAdd("m", nMeses, fInicio)
nDias = DateDiff("d", fInicio, fFinal)
Debug.Print "Años:" & nAños & " Meses:" & nMeses & " Dias:" & nDias
fnEdad = nAños & "|" & nMeses & "|" & nDias
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas