Access - dias laborales

   
Vista:

dias laborales

Publicado por Raul (11 intervenciones) el 23/01/2013 15:15:03
estoy ocupando la siguiente expresión para contar los dias transcurridos entre 2 fechas sin contar domingos ni sabados, pero no resulta

Tiempo: DifFecha("d",[tabla.fecha],Fecha())-DifFecha("w",[tabla.fecha],Fecha(),1)-DifFecha("w",[tabla. fecha],Fecha(),7)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito

dias laborales

Publicado por Neckkito (1104 intervenciones) el 23/01/2013 19:14:47
Hola!

Cuando utilizas el intervalo "w" en DateDiff no te está contando días, sino que te está contando semanas.

Es decir, que aunque le pongas el argumento opcional 1 la función no te va a contar domingos. Para ver si me puedo dar a entender:
Si entre la fecha inicial y la final hay menos de 7 días te devolverá el valor cero
Si entre la fecha inicial y la final hay, por ejemplo, 9 días, te devolverá el valor 1, independientemente de si hay uno o dos domingos entre esas fechas.
Si entre la fecha inicial y la final hay, por ejemplo, 16 días, te devolverá el valor 2, independientemente de si hay dos o tres domingos.

Espero haberme explicado claramente, pues entiendo que quizá pueda resultar un poco confuso el concepto del valor que devuelve la funcion con el intervalo "w".

La única solución que se me ocurre para lograr lo que pides es recurrir a código (salvo que alguien que sepa más que yo tenga alguna otra idea). Podrías echar un vistazo a este ejemplo a ver si lo puedes adaptar a tus necesidades: http://goo.gl/AtuFl

A través de una consulta no veo factible conseguir lo que quieres.

Saludos,


http://neckkito.siliconproject.com.ar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto

dias laborales

Publicado por Norberto (432 intervenciones) el 30/01/2013 09:33:20
Hola.

Aquí te dejo dos versiones de una función que he preparado para ello. Se basa en calcular las semanas enteras entre las dos fechas, multiplicar por 5 y añadirles los días laborables que quedan sueltos entre ellas.

Evidentemente sólo calcula los posibles días laborables. Los declarados festivos de entre semana no los descuenta. Sería posible crear una tabla con los festivos que hay durante todos los años en los que queremos que se mueva la función y crear otra que devuelva los festivos entre lunes y viernes que hay entre las dos fechas y descontar este resultado de la diferencia inicial. Si a alguien le apetece...

Versión 1 con If ... Then ... Else ... y comentarios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Public Function DateDiff5(Fecha1 As Date, Fecha2 As Date) As Long
    Dim Dif As Long
 
    If Fecha1 >= Fecha2 Then
        DateDiff5 = 0
    Else
        'Calculamos el nº de semanas entre las dos fechas y multiplicamos por 5
        Dif = DateDiff("w", Fecha1, Fecha2, vbMonday, vbFirstJan1) * 5
        'Si la fecha inferior tiene mayor día de la semana le sumamos:
        If Weekday(Fecha1, vbMonday) > Weekday(Fecha2, vbMonday) Then
            'A) Los días que le quedan a hasta el viernes
            If Weekday(Fecha1, vbMonday) < 5 Then
                Dif = Dif + 5 - Weekday(Fecha1, vbMonday)
            End If
            'Lógicamente si es sábado o domingo no sumamos nada
 
            'B) Los días que hay desde el lunes hasta la fecha mayor teniendo
               'en cuenta que:
              'o) Si la fecha mayor es anterior a sábado
            If Weekday(Fecha2, vbMonday) < 6 Then
                'los días que hay desde el lunes hasta ella
                Dif = Dif + Weekday(Fecha2, vbMonday)
              'o) Si la fecha es sábado o domingo
            Else
                '5, es decir hasta el viernes'
                Dif = Dif + 5
            End If
        Else
            'Si la fecha inferior tiene mayor día de la semana sumamos:
            ' o) Si ésta es sábado o domingo
            If Weekday(Fecha2, vbMonday) > 5 Then
                'los días que hay desde ella hasta el viernes
                Dif = Dif + 5 - Weekday(Fecha1, vbMonday)
            ' o) Si es de lunes a viernes
            Else
                'los días que hay entre las dos
                Dif = Dif + Weekday(Fecha2, vbMonday) - Weekday(Fecha1, vbMonday)
            End If
        End If
 
        DateDiff5 = Dif
    End If
 
End Function


Como se puede apreciar lo único que se hace con los if... es añadir días a la diferencia por lo que se puede simplificar usando iif(...) de esta manera:

1
2
3
4
5
6
7
8
9
10
11
Public Function DateDiff5(Fecha1 As Date, Fecha2 As Date) As Long
 
    DateDiff5 = IIf(Fecha1 > Fecha2, 0, _
      DateDiff("w", Fecha1, Fecha2, vbMonday, vbFirstJan1) * 5 + _
      IIf(Weekday(Fecha1, vbMonday) > Weekday(Fecha2, vbMonday), _
      IIf(Weekday(Fecha1, vbMonday) < 5, 5 - Weekday(Fecha1, vbMonday), 0) + _
      IIf(Weekday(Fecha2, vbMonday) < 5, Weekday(Fecha2, vbMonday), 5), _
      IIf(Weekday(Fecha2, vbMonday) > 5, 5 - Weekday(Fecha1, vbMonday), _
      Weekday(Fecha2, vbMonday) - Weekday(Fecha1, vbMonday))))
 
End Function


Cualquiera de ellas puesta en un módulo puede ser usada en expresiones SQL dentro de consultas, o directamente en formularios/informes.

Un saludo.



P.S. Si detectáis algún error, me lo hacéis saber. He activado las notificaciones por correos en este post, así que me enteraré y lo revisaré.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar