ASP: Averiguar días laborables entre dos fechas

Noviembre 23rd, 2006 by kenavik

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 inicio for 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 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"

Posted in ASP |

7 Responses

  1. Roberto Alonso Says:

    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. Roberto Alonso Says:

    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. Roberto Alonso Says:

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

    While (@Dia1

  4. Roberto Alonso Says:

    While (@Dia1

  5. Roberto Alonso Says:

    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. Roberto Alonso Says:

    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. MAYKA Says:

    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

Escribir un comentario

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.