ASP: Averiguar cuantos días laborables hay 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.


'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 inicio<finThen
for i= 0 To diferencia
'si devuelve un num 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 If

diaslaborables = 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"

Leave a comment

7 Comments.

  1. 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

  2. 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

  3. ……… continuación… parece ser que se corta:

    While (@Dia1

  4. While (@Dia1

  5. 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

  6. 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

  7. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*


Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>