2015-04-16 3 views
3

J'utilise ce code pour calculer la différence entre deux dates en ignorant le week-end:oracle sql ignorer vacances

SELECT To_date(SYSDATE) - 
     To_date('01.07.2014', 'DD.MM.YYYY') 
     - 2 * (TRUNC(Next_day(To_date(SYSDATE) - 1, 'FRI')) 
     - TRUNC(Next_day(To_date('01.07.2014' , 'DD.MM.YYYY') 
     - 1, 'FRI')))/7 AS DAYS_BETWEEN 
FROM dual 

J'ai une autre table appelée table1 dans laquelle la colonne « date » existe (son type est « DATE ») dans lequel sont inscrites toutes les dates de vacances.

table Exemple 1:

DATES 

12.06.2011 
19.06.2014 
09.05.2013 
... 

Je suis en train de faire mon chèque de code ce tableau et que si l'on est la date entre les deux dates ci-dessus qu'il fait -1 jour dans la sortie.

Répondre

1

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.

0
SELECT To_date(sysdate)- To_date('01.07.2014','DD.MM.YYYY') 
- (2 * (to_char(To_date(sysdate), 'WW') - to_char(To_date('01.07.2014','DD.MM.YYYY'), 'WW'))) AS DAYS_BETWEEN 
FROM dual 
+0

Bonjour Matt - n'est-ce pas la même chose que la mienne ci-dessus? – piguy

+0

Eh bien, je dois changer mes mots: mon code me donne 207 et le vôtre 309 - exclut-il les week-ends? – piguy

+0

@piguy essayer maintenant, a changé quelques parenthèses – Matt