ASP: Averiguar días laborables entre dos fechas
Os dejo una interesante función en ASP que tuve que hacer hace tiempo para averiguar los días laborables entre dos fechas.
Como ejemplo he cogido como fecha de inicio la fecha actual y como fecha final 7 días más respecto a la fecha actual.
'función que recibe dos fechas y nos dice cuantos
'días laborables hay entre esas dos fechas
Function diaslaborables(inicio,fin)
'busco la diferencia de días que hay entre las dos fechas
diferencia = DateDiff("d", inicio, fin)
numLaborables = 0
fechaindice = inicio
'compruebo que la fecha de inicio es menor que la fecha fin
If iniciofor i= 0 To diferencia
'si devuelve un número entre 2 y 6 inclusive entonces es un día laborable.
If Weekday(fechaindice)>=2 And Weekday(fechaindice)<=6 Then numLaborables=numLaborables+1
'pasamos al siguiente día
fechaIndice = DateAdd("d",fechaIndice,1)
next
End Ifdiaslaborables = numLaborables
End function'inicializo la fecha de inicio al día de hoy
fechainicio = Date()'le agrego 7 dias a la fecha de inicio
fechafin = DateAdd("d",fechainicio,7)
dias = diaslaborables(fechainicio,fechafin)
response.write "Desde el día "& fechainicio & " hasta el día "&fechafin & " hay "&dias & " dias laborables"
Posted in ASP |



Diciembre 13th, 2006 at 13:21
Como añadido:
Adjunto funciones para SQL SERVER para obtener los días transcurridos entre 2 fechas, EXCLUYENDO fines de semana.
Tambien adjunto el mismo código para visual basic.
Son dos funciones, una para saber si un dia es fin de semana y otra para obtener el número de dias transcurridos.
La manera de usar esta función, como ya sabreis es:
SELECT DBO.DiasLaborables(GETDATE()-12 , GETDATE())
————————–
CREATE FUNCTION ESFINSEMANA (@fecha DATETIME)
RETURNS BIT AS
BEGIN
Declare @Resultado BIT
SELECT @Resultado=CASE
WHEN LEFT(UPPER(DATENAME(dw,@fecha)),2) IN( “LU” , “MA” , “MI” , “JU” ,”VI”) THEN 0
WHEN LEFT(UPPER(DATENAME(dw,@fecha)),2) IN(”SÁ”, “DO”) Then 1
END
Return @Resultado
END
———————————–
set @Dias = CAST(@Dia2 AS INT) + 1 - CAST(@Dia1 AS INT)
set @Semanas = FLOOR(@Dias / 7)
While (@Semanas > 0)
Begin
set @DiasAcumulados = @DiasAcumulados + 5
set @Semanas = @Semanas - 1
set @Dia2 = @Dia2 - 7
End
While (@Dia1 0
DiasAcumulados = DiasAcumulados + 5
Semanas = Semanas - 1
Dia2 = Dia2 - 7
Loop
Do While Dia1
Diciembre 13th, 2006 at 13:25
SELECT DBO.DiasLaborables(GETDATE()-12 , GETDATE())
————————–
CREATE FUNCTION ESFINSEMANA (@fecha DATETIME)
RETURNS BIT AS
BEGIN
Declare @Resultado BIT
SELECT @Resultado=CASE
WHEN LEFT(UPPER(DATENAME(dw,@fecha)),2) IN( “LU” , “MA” , “MI” , “JU” ,”VI”) THEN 0
WHEN LEFT(UPPER(DATENAME(dw,@fecha)),2) IN(”SÁ”, “DO”) Then 1
END
Return @Resultado
END
———————————–
CREATE FUNCTION DiasLaborables (@dia1 datetime, @dia2 datetime)
RETURNS INT AS
BEGIN
Declare @Dias INT
Declare @Semanas INT
Declare @DiasAcumulados INT
Declare @EsLaboral BIT
set @DiasAcumulados = 0
set @Dias = CAST(@Dia2 AS INT) + 1 - CAST(@Dia1 AS INT)
set @Semanas = FLOOR(@Dias / 7)
While (@Semanas > 0)
Begin
set @DiasAcumulados = @DiasAcumulados + 5
set @Semanas = @Semanas - 1
set @Dia2 = @Dia2 - 7
End
While (@Dia1
Diciembre 13th, 2006 at 13:26
……… continuación… parece ser que se corta:
While (@Dia1
Diciembre 13th, 2006 at 13:27
While (@Dia1
Diciembre 13th, 2006 at 13:27
While (@Dia1 MENOR O IGUAL @Dia2)
Begin
Select @EsLaboral=dbo.ESFINSEMANA(@Dia1)
If (@EsLaboral=0)
Begin
set @DiasAcumulados = @DiasAcumulados + 1
End
set @Dia1 = @Dia1 + 1
End
Return @DiasAcumulados
END
Diciembre 13th, 2006 at 13:28
Private Function GetDiasLaborables(Dia1 As Date, Dia2 As Date) As Long
Dim Dias As Long
Dim Semanas As Long
Dim DiasAcumulados As Long
DiasAcumulados = 0
Dias = (Dia2 + 1) - Dia1
Semanas = Int(Dias / 7)
Do While Semanas > 0
DiasAcumulados = DiasAcumulados + 5
Semanas = Semanas - 1
Dia2 = Dia2 - 7
Loop
Do While Dia1
Junio 7th, 2007 at 17:09
necesito sober los dias de trabajo que comprenderian en mi convenio para el año 2007 siendo este de 1761 horas para teniendo 30 dias de vacaciones y 14 festivos independientes de los fines de semana.
Muchas gracias