Oracle - Funcion dias laborables

 
Vista:

Funcion dias laborables

Publicado por Dani (5 intervenciones) el 22/06/2018 09:02:17
Hola a todos,

Estoy creando una función para que cuente días laborables y festivos entre dos fechas.
Pero me da el siguiente error:
Error(11,89): PLS-00405: subconsulta no permitida en este contexto

La funcion es:

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
CREATE OR REPLACE FUNCTION DIAS_LABORABLES
 (fecha_inicio IN DATE, fecha_fin IN DATE, p_codi IN VARCHAR2)
 RETURN NUMBER IS
     vacaciones     NUMBER;
     numero_dias NUMBER := 0;
     fecha_actual DATE;
 
 BEGIN
     IF fecha_fin >= fecha_inicio THEN
         fecha_actual := fecha_inicio;
         WHILE fecha_actual <= fecha_fin LOOP
             IF TO_CHAR(fecha_actual,'DY') NOT IN ('SAT','SUN') and fecha_actual not in (select fecha from recols.dcalen where codi in (
                                                                                         select DISTINCT regexp_substr(p_codi,'[^:]+', 1, level) from RECOLS.DCAEN
                                                                                         connect by regexp_substr(p_codi, '[^:]+', 1, level) is not null))
             THEN numero_dias := numero_dias + 1;
             END IF;
             fecha_actual := fecha_actual + 1;
         END LOOP;
 
         RETURN numero_dias - vacaciones;
     ELSE
     	RETURN 0;
     END IF;
 END DIAS_LABORABLES;
 /

Me da que el error está en el IF, pero no consigo ver el motivo. En la tabla RECOLS.DCALEN tengo todos los días festivo del año por codi (codigo postal) y fecha. Alguna ayuda?

Gracias, saludos!
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

Funcion dias laborables

Publicado por Dani (5 intervenciones) el 22/06/2018 09:49:11
He estado tocando un poco mas la función y claro no me acaba de servir del todo, pongo una duda más.

En el caso de no tener fecha fin? Como sería? Es decir si tenemos fecha de inicio (por ejemplo 01/04/2018) y le quiero sumar 45 días, pero sin que cuenta festivos y fines de semana.

Alguna idea?

Gracias de antemano!
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

Funcion dias laborables

Publicado por Dani (5 intervenciones) el 22/06/2018 14:33:04
Hola de nuevo,

He ido modificando más la función hasta llegar a esto:

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
create or replace FUNCTION DIAS_LABORABLES_ACUMULADOS (p_from_date IN DATE, p_contador in number, p_codi NUMBER)
   RETURN NUMBER IS
 
 
v_dias_lab number := 1;
v_contador number := 1;
v_calen number := 0;
v_fecha date;
 
BEGIN
 
  dbms_output.put_line('Inicio');
 
  v_fecha := p_from_date;
 
  for i in 1..p_contador loop
 
      SELECT count(1)
      into v_calen
      FROM RECOLS.DCALEN
      WHERE trunc(FECHA) = trunc(v_fecha) and CODI = p_codi;
 
      if (to_char(v_fecha,'DY', 'NLS_DATE_LANGUAGE=ENGLISH') in ('SAT','SUN') or v_calen > 0) then
                  dbms_output.put_line('Entra');
                  dbms_output.put_line(v_fecha);
                  v_dias_lab := v_dias_lab;
                  v_contador := v_contador+1;
      else
                  dbms_output.put_line('Entra lab');
                  v_dias_lab := v_dias_lab+1;
                  v_contador := v_contador+1;
      end if;
 
      v_fecha := v_fecha + 1;
 
      exit when v_dias_lab >= p_contador;
 
  end loop;
 
  return v_contador;
 
END;

El problema que me encuentro es que no suma bien los días, me cuesta exactamente lo mismo que le pongo de "contador".
Alguno que pueda ayudarme con el problema?

Saludos,
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