Funciones de fechas

Un lugar dónde compartir funciones, procedimientos y aplicaciones
Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1395
Registrado: Sab Oct 24, 2015 10:12 pm

Funciones de fechas

Mensajepor Sveinbjorn » Mié Feb 03, 2016 10:13 pm

Es una pregunta bastante habitual en los foros el cómo calcular una diferencia entre dos fechas en años, meses y días.

Hoy os comparto una función que llevo usando varios años.

Ni qué decir tiene que esta misma función nos sirve para calcular la edad en años, meses y días si se le pasa como fecha final la fecha actual.

Código: Seleccionar todo

'---------------------------------------------------------------------------------------
' Procedimiento: fncDiferenciaFechas
' Autor: Sveinbjorn
' Fecha: 30/03/2013
' Descripción: Función para calcular la diferencia 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


Un saludo
Sveinbjorn El Rojo

colod10
Nivel 1
Mensajes: 19
Registrado: Lun Ene 15, 2018 12:11 am

Re: Funciones de fechas

Mensajepor colod10 » Jue Sep 22, 2022 2:33 pm

Buenos dias, estuve probando la funcion para obtener la diferencia de años, meses y dias entre 2 fechas, pero me encuentro con un #error que no veo como solucionar, me podrias dar una mano? estoy usando Access LTSC 2021. (Adjunto captura)
Adjuntos
Antiguedad.jpg
Antiguedad.jpg (23.35 KiB) Visto 132 veces

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1395
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Funciones de fechas

Mensajepor Sveinbjorn » Vie Sep 23, 2022 12:45 pm

El error lo tienes en que en las últimas filas (las del #error) no indicas las dos fechas, y tal como está definida la función, las dos fechas son obligatorias y no pueden quedar en blanco.

Soluciones hay muchas:
.- la más simple sería pasar como fecha "faltante" la fecha actual (si solo falta la de baja, te calcula la antigüedad hasta la fecha actual, y si faltan las dos, devuelve una cadena vacía)
.- modificar la función para que se recojan diversas opciones (se pueden hacer varias modificaciones diferentes, como poner los parámetros opcionales, cambiar los tipos de datos de los parámetros, cambiar la comprobación de que se hayan pasado las dos fechas...).

Un saludo
Sveinbjorn El Rojo


Volver a “Almacén Accesiano”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados