IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Calculs de jours ouvrés


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    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.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    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é.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Par défaut
    Erratum : la formule modifiée est la suvante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
      SYSDATE AS DATEJOUR, 
      TRUNC(SYSDATE) AS DATEDEBUT, 
      TRUNC(SYSDATE) + 1 AS DATEFIN  
    FROM 
      DUAL
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    DATE_DEBUT : 2010-03-24 11:11:11
    DATE_FIN : 2010-04-06 16:16:16
    JOURS_NON_OUVRES : 4

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Par défaut
    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.

Discussions similaires

  1. calcul de jours ouvrés entre 2 dates
    Par pinpin_pinpin dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/11/2009, 22h24
  2. Calcul de jours ouvrés entre 2 dates
    Par pinpin_pinpin dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/11/2009, 20h33
  3. [calcul] dernier jour ouvré du mois
    Par xolias dans le forum Oracle
    Réponses: 5
    Dernier message: 26/02/2008, 16h26
  4. Fonction de calcul de jours ouvrés
    Par jeanjean0403 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/01/2008, 10h04
  5. Réponses: 3
    Dernier message: 28/09/2007, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo