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

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.

1 respuesta más de otro experto

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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas