Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2011, 09h52   #1
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
Par défaut Calculs de jours ouvrés

Bonjour. Ca fait plusieurs jours que je planche sur la première proposition de calcul des jours ouvrés que je trouve très élégante pour effectuer un calcul hors samedi et dimanche (je ne gère pas les jours fériés). Cette solution permet de ne pas gérer de table calendrier ni de déclarer de fonction spécifique en PL/SQL.
Or, la solution semble poser un problème dès lors que je gère en jour entier et en délai. Typiquement le nombre de jours non ouvrés (en délai) entre le 10/03/2010 et le 13/03/2010 devrait être de 1 alors que le résultat est 0 et je n'arrive pas à adapter la requête.
Est-ce quelqu'un aurait une idée ?
Merci d'avance pour votre aide.
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h15   #2
Futur Membre du Club
 
Inscription : mars 2010
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 32
Points : 19
Points : 19
Entre le 10/03/2010 00:00 et le 13/03/2010 00:00, il n'y a pas de jours non ouvré.
Le 13/03 c'est le samedi à 0h00 (ou vendredi minuit ) et non pas samedi à minuit.

Par contre entre le 10/03/2010 00:00 et le 14/03/2010 00:00, tu auras bien un jour non ouvré.
allweneed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h41   #3
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
Oui je suis d'accord avec ça. Mais en terme de jours pleins, considérant pleinement mercredi, jeudi, vendredi ET samedi (équivalent samedi 13/03/2010 23h59), le samedi est donc non ouvrable. La formule de calcul est donc incorrecte et c'est cette adaptation que je n'arrive pas à faire.
Pour ce que je veux obtenir, du mercredi au samedi, il y a 1 jour non ouvrable, du mercredi au dimanche il y en a 2.
J'ai bien essayé de jouer sur DATEFIN + 1 (pour prendre le samedi comme dimanche 14/03/2010 00h00) mais dans ce cas ce sont bizarrement les périodes de 13 jours qui donnent un résultat faux.
Par exemple du 24/03/2010 au 06/04/2010 je ne trouve que 2 jours non ouvrables au lieu de 4.

Voici l'extrait de la formule modifiée :

Code :
1
2
3
 
--Durée en nombre de jours du premier week-end de la semaine restante.
  + GREATEST(LEAST(NEXT_DAY(TRUNC(TEMP.DATEDEBUT, 'DAY'), 'LUNDI'), TEMP.DATEFIN - (FLOOR((TEMP.DATEFIN - TEMP.DATEDEBUT) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC(TEMP.DATEDEBUT, 'DAY'), 'SAMEDI'), TEMP.DATEDEBUT), 0)
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h55   #4
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
Erratum : la formule modifiée est la suvante :

Code :
1
2
3
--Durée en nombre de jours du premier week-end de la semaine restante.
  + GREATEST(LEAST(NEXT_DAY(TRUNC(TEMP.DATEDEBUT, 'DAY'), 'LUNDI'), TEMP.DATEFIN+1 - (FLOOR((TEMP.DATEFIN+1 - TEMP.DATEDEBUT) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC(TEMP.DATEDEBUT, 'DAY'), 'SAMEDI'), TEMP.DATEDEBUT), 0)
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 13h23   #5
Futur Membre du Club
 
Inscription : mars 2010
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 32
Points : 19
Points : 19
Si j'ai bien compris tu veux que tes dates de début soient considérées comme la datedebut à 00:00:00 et que les dates de fin soient considérées comme datefin à 23:59:59 pour faire comme si toutes les journées étaient entières.
Si c'est bien le cas, tu dois utiliser la fonction trunc.

Code :
1
2
3
4
5
6
SELECT 
  SYSDATE AS DATEJOUR, 
  TRUNC(SYSDATE) AS DATEDEBUT, 
  TRUNC(SYSDATE) + 1 AS DATEFIN  
FROM 
  DUAL
Citation:
DATEJOUR : 2011-09-21 13:18:06
DATEDEBUT : 2011-09-21 00:00:00
DATEFIN : 2011-09-22 00:00:00
Et donc dans le code d'origine, il faut remplacer toutes les occurrences de temp.datedebut par trunc(temp.datedebut), et toutes les occurences de temp.datefin par trunc(temp.datefin) + 1.
Dans le code ci-dessous, j'ai élagué la table TEMP avec ton exemple, ainsi que la table FERIE puisque tu dis ne pas gérer les jours fériés.
J'ai aussi mis des hh:mm:ss dans les dates de début et de fin, et le résultat de cette query est bien de 4 jours pile.

Code :
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
WITH
  TEMP AS
    (
      SELECT TO_DATE('24/03/2010 11:11:11', 'DD/MM/YYYY HH24:MI:SS') AS DATEDEBUT, TO_DATE('06/04/2010 16:16:16', 'DD/MM/YYYY HH24:MI:SS') AS DATEFIN FROM DUAL
    ),
 
  FERIE AS
    (
      SELECT TO_DATE('01/01/2010', 'DD/MM/YYYY') AS JOUR FROM DUAL
    )
 
SELECT
  TEMP.DATEDEBUT AS DATE_DEBUT,
  TEMP.DATEFIN AS DATE_FIN,
 
  --Nombre de samedis et dimanches des semaines complètes qu'il est possible de former entre les 2 dates.
  FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - TRUNC(TEMP.DATEDEBUT)) / 7) * 2
 
  --Durée en nombre de jours du premier week-end de la semaine restante.
  + GREATEST(LEAST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT), 'DAY'), 'LUNDI'), (TRUNC(TEMP.DATEFIN) + 1) - (FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - TRUNC(TEMP.DATEDEBUT)) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT), 'DAY'), 'SAMEDI'), TRUNC(TEMP.DATEDEBUT)), 0)
 
  --Durée en nombre de jours du deuxième week-end de la semaine restante.
  --Exemple : ce cas peut se présenter si la semaine restante commence le samedi 10/04/2010 à 22:00, et se termine le samedi 17/04/2010 à 08:00.
  + GREATEST(LEAST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT) + INTERVAL '7' DAY, 'DAY'), 'LUNDI'), (TRUNC(TEMP.DATEFIN) + 1) - (FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - TRUNC(TEMP.DATEDEBUT)) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC(TRUNC(TEMP.DATEDEBUT) + INTERVAL '7' DAY, 'DAY'), 'SAMEDI'), TRUNC(TEMP.DATEDEBUT)), 0)
 
  --Nombre de jours fériés qui ne sont ni un samedi ni un dimanche (car déjà comptabilisés).
  + NVL(SUM(GREATEST(LEAST(TRUNC(JOUR + INTERVAL '1' DAY, 'DD'), (TRUNC(TEMP.DATEFIN) + 1)) - GREATEST(TRUNC(JOUR, 'DD'), TRUNC(TEMP.DATEDEBUT)), 0)), 0)
 
  AS JOURS_NON_OUVRES
FROM
  TEMP
  LEFT OUTER JOIN FERIE ON TO_CHAR(JOUR, 'D') NOT IN (6, 7)
GROUP BY
  TEMP.DATEDEBUT,
  TEMP.DATEFIN
Citation:
DATE_DEBUT : 2010-03-24 11:11:11
DATE_FIN : 2010-04-06 16:16:16
JOURS_NON_OUVRES : 4
allweneed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h01   #6
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
Cool ! Je pense qu'on s'approche du résultat. Cependant en terme de délai le 1er jour ne doit pas être comptabilisé. Dans cette nouvelle formule il reste des cas particuliers, par exemple :

Du 13/03 au 15/03, ça fait 2 jours de délai mais 1 seul jour non ouvrés (le dimanche) et non pas 2, soit 1 jour ouvré
Du 13/03 au 21/03, ça fait 8 jours de délai mais 3 jours non ouvrés (14, 20 et 21) et non pas 4, soit 5 jours ouvrés

Le problème intervient principalement lorsque le 2er jour tombe un week-end.

Alors en cherchant à calculer le nombre de jours ouvrés je peux faire datedebut-datefin-jours_non_ouvres+1 mais du coup ce sont tous les autres cas qui ne fonctionnent pas.
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h20   #7
Futur Membre du Club
 
Inscription : mars 2010
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 32
Points : 19
Points : 19
Désolé, mais je ne comprends pas ta demande.
Qd tu dis 2 jours de délai entre le 13/03 et le 15/03.
Précédemment j'ai cru comprendre que tu voulais des jours pleins -> 13/03 00:00 -> 15/03 23:59 ça fait 3 jours de délai.

Si tu pouvais réexpliquer ta demande depuis le début
De ce que j'ai compris, tu veux calculer des jours ouvrés, tu ne te soucies pas des jours fériés. Il y a un truc avec les journées entières mais j'ai peur de ne rien avoir compris

Vla si tu veux plus d'aide il va falloir être plus précis parce que là je sèche

Dis peut-être les dates de début et de fin (avec notion d'heures) que tu as, et le résultat souhaité en nbr de jours ouvrés pour plusieurs exemples qui faciliteront la compréhension de ce que tu souhaites.
allweneed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 15h31   #8
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
OK. Pas de souci, je vais réexpliquer. En tout cas je te remercie d'avance pour ton aide.

Je cherche à trouver le nombre de jours ouvrés en délai entre 2 dates. Ex: je fais une demande à une date, j'ai une réponse quelques jours plus tard. En délai ça veut dire que 1j de délai c'est une réponse le lendemain, 2j le surlendemain, etc. Je ne m'occupe pas des heures de la journée ni des jours fériés.

Si je fais ma demande le lundi et que j'ai ma réponse le mercredi j'ai bien un délai de 2j, pour 2j ouvrés (mardi et mercredi) et 0j non ouvré.
Si je fais ma demande le vendredi et que j'ai ma réponse le lundi j'ai bien un bien un délai de 3j (samedi, dimanche, lundi) pour 1j ouvrés (lundi) et 2j non ouvrés (samedi, dimanche)
Si je fais ma demande le samedi et que j'ai ma réponse le mardi j'ai bien un délai 3j (dimanche, lundi, mardi) pour 2j ouvrés (lundi, mardi) et 1j non ouvré (dimanche)

Ci-dessous un petit jeu d'essai sous forme de requête qui précise la valeur attendue à savoir le délai en nombre de jours ouvrés.

Code :
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
45
46
47
48
49
50
51
52
53
 
WITH
  TEMP AS
    (
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('11/03/2010', 'DD/MM/YYYY') AS DATEFIN, 1 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('13/03/2010', 'DD/MM/YYYY') AS DATEFIN, 2 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEFIN, 2 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('15/03/2010', 'DD/MM/YYYY') AS DATEFIN, 3 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEFIN, 0 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('21/03/2010', 'DD/MM/YYYY') AS DATEFIN, 5 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('31/03/2010', 'DD/MM/YYYY') AS DATEFIN, 13 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('12/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('27/03/2010', 'DD/MM/YYYY') AS DATEFIN, 10 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('08/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('22/03/2010', 'DD/MM/YYYY') AS DATEFIN, 10 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('12/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('19/03/2010', 'DD/MM/YYYY') AS DATEFIN, 5 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('01/05/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('01/06/2010', 'DD/MM/YYYY') AS DATEFIN, 21 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/05/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('24/05/2010', 'DD/MM/YYYY') AS DATEFIN, 7 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/05/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('26/05/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('22/12/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('31/12/2010', 'DD/MM/YYYY') AS DATEFIN, 7 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('06/04/2010', 'DD/MM/YYYY') AS DATEFIN, 8 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('07/04/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('08/04/2010', 'DD/MM/YYYY') AS DATEFIN, 10 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('26/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('08/04/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('20/04/2010', 'DD/MM/YYYY') AS DATEFIN, 18 AS ATTENDU FROM DUAL
    )
 
SELECT
  TEMP.DATEDEBUT AS DATE_DEBUT,
  TEMP.DATEFIN AS DATE_FIN,
  TEMP.ATTENDU AS ATTENDU,
  TEMP.DATEFIN-TEMP.DATEDEBUT AS DELAI
FROM
  TEMP
ORDER BY TEMP.DATEDEBUT, TEMP.DATEFIN;
Voilà... j'espère avoir été plus clair.
Merci d'avance.
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 16h07   #9
Futur Membre du Club
 
Inscription : mars 2010
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 32
Points : 19
Points : 19
Ok c'est beaucoup plus clair ainsi.
Il suffit donc de jouer sur la date + 1 pour la date de debut, et la date de fin.

Code :
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
WITH
  TEMP AS
    (
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('11/03/2010', 'DD/MM/YYYY') AS DATEFIN, 1 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('13/03/2010', 'DD/MM/YYYY') AS DATEFIN, 2 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEFIN, 2 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('10/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('15/03/2010', 'DD/MM/YYYY') AS DATEFIN, 3 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEFIN, 0 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('21/03/2010', 'DD/MM/YYYY') AS DATEFIN, 5 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('31/03/2010', 'DD/MM/YYYY') AS DATEFIN, 13 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('12/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('14/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('27/03/2010', 'DD/MM/YYYY') AS DATEFIN, 10 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('08/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('22/03/2010', 'DD/MM/YYYY') AS DATEFIN, 10 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('12/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('19/03/2010', 'DD/MM/YYYY') AS DATEFIN, 5 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('01/05/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('01/06/2010', 'DD/MM/YYYY') AS DATEFIN, 21 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/05/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('24/05/2010', 'DD/MM/YYYY') AS DATEFIN, 7 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('13/05/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('26/05/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('22/12/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('31/12/2010', 'DD/MM/YYYY') AS DATEFIN, 7 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('06/04/2010', 'DD/MM/YYYY') AS DATEFIN, 8 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('07/04/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('08/04/2010', 'DD/MM/YYYY') AS DATEFIN, 10 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('26/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('08/04/2010', 'DD/MM/YYYY') AS DATEFIN, 9 AS ATTENDU FROM DUAL
      UNION ALL
      SELECT TO_DATE('25/03/2010', 'DD/MM/YYYY') AS DATEDEBUT, TO_DATE('20/04/2010', 'DD/MM/YYYY') AS DATEFIN, 18 AS ATTENDU FROM DUAL
    ),
 
  FERIE AS
    (
      SELECT TO_DATE('01/01/1900', 'DD/MM/YYYY') AS JOUR FROM DUAL
    )
 
SELECT
  TEMP.DATEDEBUT AS DATE_DEBUT,
  TEMP.DATEFIN AS DATE_FIN,
  TEMP.ATTENDU AS ATTENDU,
 
  (TEMP.DATEFIN-TEMP.DATEDEBUT) - (
  --Nombre de samedis et dimanches des semaines complètes qu'il est possible de former entre les 2 dates.
  FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - (TRUNC(TEMP.DATEDEBUT) + 1)) / 7) * 2
 
  --Durée en nombre de jours du premier week-end de la semaine restante.
  + GREATEST(LEAST(NEXT_DAY(TRUNC((TRUNC(TEMP.DATEDEBUT) + 1), 'DAY'), 'LUNDI'), (TRUNC(TEMP.DATEFIN) + 1) - (FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - (TRUNC(TEMP.DATEDEBUT) + 1)) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC((TRUNC(TEMP.DATEDEBUT) + 1), 'DAY'), 'SAMEDI'), (TRUNC(TEMP.DATEDEBUT) + 1)), 0)
 
  --Durée en nombre de jours du deuxième week-end de la semaine restante.
  --Exemple : ce cas peut se présenter si la semaine restante commence le samedi 10/04/2010 à 22:00, et se termine le samedi 17/04/2010 à 08:00.
  + GREATEST(LEAST(NEXT_DAY(TRUNC((TRUNC(TEMP.DATEDEBUT) + 1) + INTERVAL '7' DAY, 'DAY'), 'LUNDI'), (TRUNC(TEMP.DATEFIN) + 1) - (FLOOR(((TRUNC(TEMP.DATEFIN) + 1) - (TRUNC(TEMP.DATEDEBUT) + 1)) / 7) * 7)) - GREATEST(NEXT_DAY(TRUNC((TRUNC(TEMP.DATEDEBUT) + 1) + INTERVAL '7' DAY, 'DAY'), 'SAMEDI'), (TRUNC(TEMP.DATEDEBUT) + 1)), 0)
 
  --Nombre de jours fériés qui ne sont ni un samedi ni un dimanche (car déjà comptabilisés).
  + NVL(SUM(GREATEST(LEAST(TRUNC(JOUR + INTERVAL '1' DAY, 'DD'), (TRUNC(TEMP.DATEFIN) + 1)) - GREATEST(TRUNC(JOUR, 'DD'), (TRUNC(TEMP.DATEDEBUT) + 1)), 0)), 0)
 )
  AS JOURS_OUVRES,
 
  TEMP.DATEFIN-TEMP.DATEDEBUT AS DELAI
FROM
  TEMP
  LEFT OUTER JOIN FERIE ON TO_CHAR(JOUR, 'D') NOT IN (6, 7)
GROUP BY
  TEMP.DATEDEBUT,
  TEMP.DATEFIN,
  attendu
allweneed est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2011, 17h31   #10
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
Génial ! Merci beaucoup. Mon jeu d'essai passe maintenant correctement.

A l'occasion, si c'est possible, pourrais tu me donner quelques explications sur la formule ? Qu'est ce que tu entends par "premier week-end de la semaine restante" par exemple.

En fait j'aimerais bien comprendre la formule, ce qui n'est pas du tout le cas . C'est pour cela que je n'ai pas réussi à l'adapter.
C'est si tu as le temps bien sûr

En tout cas grand merci pour ton aide
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 20h45   #11
Futur Membre du Club
 
Inscription : mars 2010
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 32
Points : 19
Points : 19
C'est loin ... l'idée c'est au départ de calculer le nombre de jours non ouvrés.
Le plus simple au début c'est de calculer le nombre de semaines complètes entre nos 2 bornes.
On sait qu'on a déjà le nombre de semaines complètes x 2 jours non ouvrés (samedis et dimanches des semaines complètes).

On retire ensuite nos semaines complètes de nos 2 bornes.
Si on avait comme borne du 07/09/2011 au 24/09/2011, on a 2 semaines complètes, ce qui fait déjà 2x2 jours non ouvrés.
On calcule à partir de ça nos nouvelles bornes qui sont du 07/09/2011 au 10/09/2011 (23/09 - 2 semaines = 10/09).

Ca nous donne donc 4 jour non ouvrés + les jours non ouvrés qu'on peut retrouver entre nos nouvelles bornes.

A partir de là, on sait que nos nouvelles bornes ne s'étendent pas sur plus d'une semaine.

Dans mon exemple, du 07/09 au 10/09, il n'y a qu'un we à la fin.

Mais vu que nos bornes s'étendent sur max 1 semaine, avec d'autres dates de départ, on aurait aussi pu avoir comme nouvelles bornes du 11/09/2011 23:00:00 au 17/09/2011 02:00:00.
Dans ce cas, on a un bout de we au début de nos nouvelles bornes, et un autre bout de we à la fin de notre borne.
Ce sont ces bouts que je calcule séparément.

Pour ce qui est du code, il faut le lire avec attention, c'est un petit casse-tête tout de même

Tant mieux si le code t'a aidé, c'est dans ce but que je l'avais posté à l'époque.
allweneed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 09h21   #12
Invité de passage
 
Homme Ludovic
Développeur Java
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 0
Points : 0
OK. Merci beaucoup pour ces explications. Je vais pouvoir réétudier la formule pour comprendre un peu mieux.
Merci encore pour ton aide
leludo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h05.


 
 
 
 
Partenaires

Hébergement Web