Como calcular cantidad de días entre dos fechas de una Base de Datos

Tengo una duda, quisiera saber de que manera hacer la siguiente operación. Tengo una base de datos, con una tabla "ORDEN DE TRABAJO" y su form llamado igual, en el form hay entre otros los siguientes textbox: fechainicioTXT, fechatermTXT y diasTXT, asociados a los campos FECHA INICIO, FECHA TERMINACIÓN y DÍAS, respectivamente.
La duda es la siguiente; de que manera se puede hacer para que una vez introducida la fecha inicio y la cantidad de días me calcule/muestre la fecha de terminación. Teniendo en cuenta que el domingo no se trabaja.
Además tengo un subform FUERZA DE TRABAJO, con su propia tabla pero este también tiene sus propios campos FECHA INICIO, FECHA TERMINACIÓN y DÍAS, con sus textbox: fechainicioTXT, fechatermTXT y diasTXT. En este segundo caso deseo introducir fecha inicio y fecha de terminación, y que días calcule/muestre la cantidad de días teniendo en cuenta que el sábado es media jornada y el domingo no se trabaja. Pues después debo usar la cantidad de días para calcular salario.
Espero me puedan ayudar, bien con un código VBA para aplicarlo en un evento o bien en un campo calculado.

1 Respuesta

Respuesta
1

¿Y qué pasa con los días festivos?. Yo utilizo una función que desarrollé hace bastante tiempo para determinar los festivos de Colombia en donde algunos se trasladan al día lunes, esto me permite calcular los días laborables entre 2 fechas. Este es el link:

https://mega.nz/#!TMkFES6D!6RGkDnt_1lG6V5RkDMYxE3KBpZIwm3UECAMuIcjbf_Q 

Ahora, si no necesita los días festivos está esta opción:

Access - URGE: Calcular dias hábiles entre 2 fechas (lawebdelprogramador.com)

Hola y muchas gracias por tu rápida respuesta, y disculpas por mi tardanza en responder, implemente el código que me sugeriste, y me funciona, pero tengo varios problemas que no se como resolver.
1º- En el caso de que un trabajo se haga en un solo día, la fecha de inicio y de terminación son las misma, por lo que el código me devuelve 0. Ya que si lo entendí bien lo que hace es contar entre el primero y el último, pero no cuenta el primero.
2º- Necesito que no cuente el domingo (lo cual hace correctamente) pero que el sábado lo cuente como medio día (lo cual ahora no hace y no sé cómo modificarlo). Te pongo un ejemplo si añado un trabajo con fecha de inicio el jueves y fecha de terminación el martes de la siguiente semana el código devuelve 4 días pues no cuenta ni sábado ni domingo, pero necesitaría que devuelva 4,5.
3º- Existiría alguna forma de modificar el código para que en ves de entrar fecha inicio y fecha terminación, devolviendo días trabajados. Se pueda introducir Fecha de Inicio y días, para devolver Fecha terminación. Esto manteniendo la condición de eliminar los sábados y domingo.
Este es el código que copie de la Pág. que me sugeriste. Espero me puedas ayudar, Gracias.
Function Work_Days (BegDate As Variant, EndDate As Variant) As Integer
' Esta función no tiene en cuenta los dias festivos.
Dim WholeWeeks As Variant
Dim DateCnt As Variant
Dim EndDays As Integer
BegDate = DateValue(BegDate)
EndDate = DateValue(EndDate)
WholeWeeks = DateDiff("w", BegDate, EndDate)
DateCnt = DateAdd("ww", WholeWeeks, BegDate)
EndDays = 0
Do While DateCnt < EndDate
If Format(DateCnt, "ddd") <> "Sun" And _
Format(DateCnt, "ddd") <> "Sat" Then
EndDays = EndDays + 1
End If
DateCnt = DateAdd("d", 1, DateCnt)
Loop
Work_Days = WholeWeeks * 5 + EndDays
End Function

Esta le sirve:

Function Work_Days(BegDate As Variant, EndDate As Variant) As Double
' Esta función no tiene en cuenta los dias festivos.
' Resta 1/2 dia si es sábado
' Adaptado por: Eduardo Pérez Fernández
' 03/01/2021
Dim WholeWeeks As Variant
Dim DateCnt As Variant
Dim EndDays As Integer
Dim reducir As Double 'para reducir en 0.5 si es sábado
Dim x As Integer
Dim i As Integer
Dim aux As Date
x = DateDiff("d", BegDate, EndDate)
If x = 0 Then ' el mismo dia
If Weekday(BegDate, vbSunday) = 7 Then 'sabado. considero el 1er dia de la semana domingo
reducir = 0.5
End If
Work_Days = reducir
Exit Function
Else
For i = 1 To x
aux = CDate(BegDate) + i
If Weekday(aux, vbSunday) = 7 Then 'sabado
reducir = reducir + 0.5
End If
Next i
End If

BegDate = DateValue(BegDate)
EndDate = DateValue(EndDate)
WholeWeeks = DateDiff("w", BegDate, EndDate)
DateCnt = DateAdd("ww", WholeWeeks, BegDate)
EndDays = 0
Do While DateCnt < EndDate
If Format(DateCnt, "ddd") <> "Sun" And _
Format(DateCnt, "ddd") <> "Sat" Then
EndDays = EndDays + 1
End If
DateCnt = DateAdd("d", 1, DateCnt)
Loop
Work_Days = WholeWeeks * 5 + EndDays - reducir
End Function

Disculpe hay un error en la función, mire a ver si esta le funciona;

Function Work_Days(BegDate As Variant, EndDate As Variant) As Double
' Esta función no tiene en cuenta los dias festivos.
' Resta 1/2 dia si es sábado
' Adaptado por: Eduardo Pérez Fernández
' 03/01/2021
Dim WholeWeeks As Variant
Dim DateCnt As Variant
Dim EndDays As Integer
Dim reducir As Double 'para reducir en 0.5 si es sábado
Dim x As Integer
Dim i As Integer
Dim aux As Date
x = DateDiff("d", BegDate, EndDate)
If x = 0 Then ' el mismo dia
If Weekday(BegDate, vbSunday) = 7 Then 'sabado. considero el 1er dia de la semana domingo
reducir = 0.5
End If
Work_Days = reducir
Exit Function
Else
For i = 0 To x
aux = CDate(BegDate) + i
If Weekday(aux, vbSunday) = 7 Then 'sabado
reducir = reducir + 0.5
End If
Next i
End If
BegDate = DateValue(BegDate)
EndDate = DateValue(EndDate)
WholeWeeks = DateDiff("w", BegDate, EndDate)
DateCnt = DateAdd("ww", WholeWeeks, BegDate)
EndDays = 0
Do While DateCnt < EndDate
If Format(DateCnt, "ddd") <> "Sun" And _
Format(DateCnt, "ddd") <> "Sat" Then
EndDays = EndDays + 1
End If
DateCnt = DateAdd("d", 1, DateCnt)
Loop
Work_Days = (WholeWeeks * 5 + EndDays) + reducir
End Function

EJEMPLO

?work_days("04/01/2021","23/01/2021") ---- resultado 16.5 días hay 3 sábados

?work_days("04/01/2021","30/01/2021")---- resultado 22 días  hay 4 sábados

¡Gracias!  Ya lo implemente en la bd tuve que hacer unas modificaciones, pero ya está funcionando.

No daba error, esta es más sencilla y efectiva

Public Function diaslab(ByVal fechaini As Variant, ByVal fechafin As Variant) As Double

' Esta función no tiene en cuenta los dias festivos.
' Resta 1/2 dia si es sábado
' Elaborado por: Eduardo Pérez Fernández
' 03/01/2021

Dim diasbruto As Integer
Dim domingos As Integer
Dim sabados As Double
fechaini = CDate(fechaini)
fechafin = CDate(fechafin)

If fechaini = fechafin Then ' El mismo dia
If Weekday(fechaini, vbSunday) = 7 Then 'Sábado
diaslab = 0.5
Else
diaslab = 1
End If
Exit Function
End If
diasbruto = DateDiff("d", fechaini, fechafin) + 1 'Par contar desde el primer día
domingos = DateDiff("ww", fechaini, fechafin, 1) - Int(1 = Weekday(fechaini))
sabados = (DateDiff("ww", fechaini, fechafin, 7) - Int(7 = Weekday(fechaini))) * 0.5
diaslab = diasbruto - domingos - sabados
End Function

Calculo los días entre las 2 fechas y a esta le sumo los domingos entre las 2 fechas y los sábados entre estas multiplcados por 0.5

Gracias de nuevo Eduardo, en efecto el otro código no daba error era solo que no me calculaba como quería; pues dejaba de contar un día, ya probé este y funciona como lo necesito gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas