Il devrait être facile si vous diviser en tâches suivantes:
- Generate toutes les dates entre les deux dates données à l'aide de la méthode générateur ligne comme indiqué here.
- Ignore les dates qui sont le week-end, à savoir samedi et le dimanche
- Vérifiez si les dates de la plage ont de toute correspondance dans la table de vacances .
Le vous générateur ligne suivante requête donnera le nombre total de semaine, à savoir pas y compris le samedi et le dimanche:
SQL> WITH dates AS
2 (SELECT to_date('01/01/2014', 'DD/MM/YYYY') date1,
3 to_date('31/12/2014', 'DD/MM/YYYY') date2
4 FROM dual
5 )
6 SELECT SUM(weekday) weekday_count
7 FROM
8 (SELECT
9 CASE
10 WHEN TO_CHAR(date1+LEVEL-1, 'DY','NLS_DATE_LANGUAGE=AMERICAN')
11 NOT IN ('SAT', 'SUN')
12 THEN 1
13 ELSE 0
14 END weekday
15 FROM dates
16 CONNECT BY LEVEL <= date2-date1+1
17 )
18/
WEEKDAY_COUNT
-------------
261
SQL>
Maintenant, sur requête de générateur de ligne au-dessus , voyons un cas de test.
La requête suivante calcule le nombre de jours ouvrables entre 1 janvier 2014 et 31 décembre 2014 sauf les jours fériés comme indiqué dans le tableau.
L'AVEC clause ne l'utiliser sous forme de tableaux, dans votre cas, vous pouvez simplement utiliser votre table de vacances.
SQL> WITH dates
2 AS (SELECT To_date('01/01/2014', 'DD/MM/YYYY') date1,
3 To_date('31/12/2014', 'DD/MM/YYYY') date2
4 FROM dual),
5 holidays
6 AS (SELECT To_date('12.06.2011', 'DD.MM.YYYY') holiday FROM dual UNION ALL
7 SELECT To_date('19.06.2014', 'DD.MM.YYYY') holiday FROM dual UNION ALL
8 SELECT To_date('09.05.2013', 'DD.MM.YYYY') holiday FROM dual),
9 count_of_weekdays
10 AS (SELECT SUM(weekday) weekday_count
11 FROM (SELECT CASE
12 WHEN To_char(date1 + LEVEL - 1, 'DY',
13 'NLS_DATE_LANGUAGE=AMERICAN')
14 NOT IN (
15 'SAT',
16 'SUN') THEN 1
17 ELSE 0
18 END weekday
19 FROM dates
20 CONNECT BY LEVEL <= date2 - date1 + 1)),
21 count_of_holidays
22 AS (SELECT Count(*) holiday_count
23 FROM holidays
24 WHERE holiday NOT BETWEEN To_date('01/01/2015', 'DD/MM/YYYY') AND
25 To_date('31/03/2015', 'DD/MM/YYYY'))
26 SELECT weekday_count - holiday_count as working_day_count
27 FROM count_of_weekdays,
28 count_of_holidays
29/
WORKING_DAY_COUNT
-----------------
258
SQL>
Il y avait au total 261 jours de la semaine , dont il y avait 3 jours danstable de vacances. Ainsi, le nombre total de jours de travail dans la sortie est 261 - 3 = 258
.
Bonjour Matt - n'est-ce pas la même chose que la mienne ci-dessus? – piguy
Eh bien, je dois changer mes mots: mon code me donne 207 et le vôtre 309 - exclut-il les week-ends? – piguy
@piguy essayer maintenant, a changé quelques parenthèses – Matt