Como calcular días hábiles a partir de una fecha

En una consulta necesito calcular 3 días hábiles (de lunes a viernes) a partir de hoy 5/12

Mañana viernes día 6 es festivo, o sea tendría que calcular el día 12/12

2 respuestas

Respuesta
1

Te digo cómo lo haría yo, en Access y puediendo usarlo en una consulta:

1º/ Tendría una tabla TFestivos con al menos un campo Festivo, de tipo fecha en el que poner los festivos.

2º/ En un módulo pondría esta función (adaptada del ejemplo de Neckkito Contar dias 2):

Public Function fncSumarDiasHabiles(laFechaIni As Date, numDias As Integer) As Date
    Dim i As Integer
    Dim fTmp As Date
        'Inicializamos las variables fTmp
    fTmp = laFechaIni
        'Analizamos día a día la fecha temporal. Si es sábado o domingo
        'o festivo obliga a realizar una iteración más a través de i=i-1
    For i = 1 To numDias
            'Comprobamos si el día de la fecha en cuestión es festivo
            'Si devuelve un valor no nulo es que hay coincidencia
            'En este caso nos movemos a la fecha siguiente y forzamos una nueva reiteración
        If Not IsNull(DLookup("[Festivo]", "TFestivos", "[Festivo]=#" & Format(fTmp, "mm/dd/yy") & "#")) Then
            fTmp = fTmp + 1
            i = i - 1
                'Si no es festivo analizamos si es sábado o domingo
        Else
                'Si es sábado o domingo nos movemos
                'a la fecha siguiente y forzamos una nueva reiteración
            If Weekday(fTmp) = vbSaturday Or Weekday(fTmp) = vbSunday Then
                fTmp = fTmp + 1
                i = i - 1
                    'Si no lo es, nos movemos a la fecha siguiente
            Else
                fTmp = fTmp + 1
            End If
        End If
    Next
'---BLOQUE TRES: ANÁLISIS DEL ÚLTIMO DÍA OBTENIDO----------------------------
        'Creamos el bloque que analizará el último día
    For i = 1 To 1
            'Si el día es festivo nos movemos al día siguiente y forzamos una nueva reiteración
        If Not IsNull(DLookup("[Festivo]", "TFestivos", "[Festivo]=#" & Format(fTmp, "mm/dd/yy") & "#")) Then
            fTmp = fTmp + 1
            i = i - 1
                'Si no es festivo miramos si es sábado o domingo
        Else
                'Si es sábado o domingo nos movemos al día siguiente y forzamos una nueva reiteración
            If Weekday(fTmp) = vbSaturday Or Weekday(fTmp) = vbSunday Then
                fTmp = fTmp + 1
                i = i - 1
            End If
        End If
    Next
    fncSumarDiasHabiles = fTmp
End Function

3º/ En la consulta, suponiendo que en la tabla tengas un campo FInicial, añades un nuevo campo con esta expresión:

FechaFinal: fncSumarDiasHabiles([FInicial;3)

Y listo. Aquí te dejo un ejemplo: http://www.filebig.net/files/YUZyQT44kr 

De todos modos, como te dice Icue, convendría saber exactamente a qué te refieres con añadir 3 días hábiles, porque según mis cuentas (y las de mi función) el tercer día hábil desde el 5 de diciembre es el día 11. Si necesitas que te devuelva el siguiente al tercero (o que deje esos 3 días hábiles entre la fecha inicial y la final), en el código d la función cambia esta línea:

fTmp=laFechaInicial

por ésta otra:

fTmp=laFechaInicial+1

Y ya te dará el resultado que buscas.

Respuesta

El problema de esos cálculos es definir que se entiende por, por ejemplo, ¿Cuántos días hay entre una fecha y otra fecha?. ¿Se cuenta la fecha inicial, ya que el día no termina hasta las 23:59:59,999999..., y no se cuenta la final?. ¿No se cuenta el día inicial y si se cuenta el final? ¿Se cuentan ambos.? ¿No se cuenta ninguno?

Por ejemplo, si tengo una tabla donde están los festivos y construyo un formulario

Cuando pulso Enter

Lo cual es cierto, quizá no valido, ya que "cuenta", el 5 que todavía no ha terminado, el 9 y el 10.

El código del evento Despues de actualizar del cuadro de texto Dias, en este caso es

Dim c As Integer, NoLaborables As Integer, Festivos As Integer
For c = 1 To Dias
If Format(FechaInicial + c, "dddd") = "domingo" Or Format(FechaInicial + c, "dddd") = "sábado" Then
NoLaborables = Nz([NoLaborables], 0) + 1
ElseIf DCount("*", "festivos", "festivo=#" & Me.FechaInicial & "# + " & c & "") Then
Festivos = Nz([Festivos], 0) + 1
End If
Next
FechaFinal = FechaInicial + Dias + NoLaborables + Festivos
If Format(FechaFinal, "dddd") = "Sábado" Then
FechaFinal = FechaFinal + 2
ElseIf Format(FechaFinal, "dddd") = "Domingo" Then
FechaFinal = FechaFinal + 1
End If

Por eso, sería conveniente que fijaras que días quieres que se tengan en cuenta.

Por cierto, no lo sé pero dudo que puedas hacerlo en SQL.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas