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

SQL Oracle Discussion :

Nombre de jours ouvrés entre deux dates


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Expert SI
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert SI

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Nombre de jours ouvrés entre deux dates
    Bonjour à tous,

    Dans le cadre de la mise en place d'un outil de reporting (JasperSoft), je suis en charge de présente quelques indicateurs mais je suis novice en SQL.

    J'ai bien trouvé des exemples sur dans les forums mais je n'arrive pas à les adapter à mon besoin, pourtant assez simple

    Je dois calculer la différence entre deux tables DATE_SHIP - DATE_RCPT sans les samedi et dimanche (voir si possible les jours fériés) pour et les regrouper par délais (J, J+1, etc.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select Count(*)
    From ARCH_REQUEST
    Where to_number(to_char(DATE_SHIP,'J'))- to_number(to_char(DATE_RCPT,'J')) =7
    Cette requête fonctionne mais ne tiens pas compte des jours non ouvrés et je ne vois pas comment lui faire exclure puisqu'elle fait un calcul sur la durée.

    Merci pour votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Le plus simple est d'utiliser une table calendrier :
    Calendrier avec jours fériés

    Attention avec l'utilisation de TO_CHAR qui dépend du NLS_TERRITORY, à bien paramétrer avant de créer la table calendrier.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Expert SI
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert SI

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse mais je n'ai malheureusement qu'un accès restreint à la base et donc je ne peux pas créer de nouvelles tables

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Il suffit de construite une "table" des jours fériées par énumération avec une CTE (clause WITH, voir http://sqlpro.developpez.com/cours/s...te-recursives/) puis d'exclure les jours exprimés par cette table de la requête de comptage.

    Exemple (succinct) :

    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
    WITH
    AN AS  (          SELECT 2015 AS AN                         FROM DUAL
            UNION ALL SELECT 2016                               FROM DUAL
    ),
    JFF AS (          SELECT  1 AS MOIS,  1 AS JOUR             FROM DUAL
            UNION ALL SELECT  5,  1                             FROM DUAL 
            UNION ALL SELECT  5,  8                             FROM DUAL 
            UNION ALL SELECT  7, 14                             FROM DUAL 
    		UNION ALL SELECT  8, 15                             FROM DUAL 
    		UNION ALL SELECT 11,  1                             FROM DUAL 
    		UNION ALL SELECT 11, 11                             FROM DUAL 
            UNION ALL SELECT 12, 25                             FROM DUAL 
    ),
    JFV AS (          SELECT  3 AS MOIS, 28 AS JOUR, 2016 AS AN FROM DUAL
            UNION ALL SELECT  5,  5, 2016                       FROM DUAL
    		UNION ALL SELECT  5, 16, 2016                       FROM DUAL
    		UNION ALL SELECT  4,  6, 2015                       FROM DUAL
    		UNION ALL SELECT  5, 14, 2015                       FROM DUAL
    		UNION ALL SELECT  5, 25, 2015                       FROM DUAL
    ),
    JF AS (SELECT DATEFROMPARTS(AN, MOIS, JOUR) AS D FROM JFV
           UNION ALL
    	   SELECT DATEFROMPARTS(AN, MOIS, JOUR) FROM JFF CROSS JOIN AN)
    SELECT COUNT(*)
    FROM   MaTableDeTravail
    WHERE  MaDate NOT IN (SELECT D FROM JF);
    Si vous n'avez pas la fonction DATEFROMPARTS, créez la ou bien remplacez la par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (AN (FORMAT '9(4)') (CHAR(4)))||'-'|| (MOIS (FORMAT '9(2)') (CHAR(2)))||'-'|| (JOUR (FORMAT '9(2)') (CHAR(2))) (DATE)
    A +

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Expert SI
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert SI

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Beaucoup Frederic,

    J'ai commencé la lecture de vos tuto sur le SQL et je trouve ça passionnant, je vais essayer de comprendre cette requête et de l'adapter à mon besoin.

    Je vous informerais des suites.

    Cordialement

    Pouchy

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Pour revenir sur la solution proposée, deux choses à dire :
    1) il est possible de calculer à l'avance toutes les dates fériées mobiles en utilisant par exemple les formules de calcul de John Meus. j'ai donné un exemple de procédure de calcul ici (pour SQL Server, mais facile à adaptée). Ceci peut être repris dans une requête.
    2) une table de dates et plus particulièrement un calendrier sera toujours préférables, notamment pour les performances. Rien ne vous empêche de créer un nouveau schéma SQL et d'y mettre vos tables dedans. Au passage notez qu'il est dommage qu'Oracle ne soit pas multibase (le multi tenant n'étant juste à mon sens qu'un gadget pour faire payer des licences supplémentaire sans que les utilisateurs n'en soient conscient !)

    A +

    Citation Envoyé par Pouchy Voir le message
    Merci Beaucoup Frederic,

    J'ai commencé la lecture de vos tuto sur le SQL et je trouve ça passionnant, je vais essayer de comprendre cette requête et de l'adapter à mon besoin.

    Je vous informerais des suites.

    Cordialement

    Pouchy

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Expert SI
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert SI

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (AN (FORMAT '9(4)') (CHAR(4)))||'-'|| (MOIS (FORMAT '9(2)') (CHAR(2)))||'-'|| (JOUR (FORMAT '9(2)') (CHAR(2))) (DATE)
    J'ai remplacé la fonction par ce code mais SQL Developer m'indique "Missing right parenthesis" alors que je n'y vois pas d'erreur de découpage pour l'année, le mois et le jour

    Pour SQL Dev l'erreur se situe après le premier 'FORMAT'

    Cordialement

    Pouchy

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Hélas je n'ai pas d'Oracle sous la main... J'ai fait cela de tête !!!

    A +

Discussions similaires

  1. Nombre de jours ouvrés entre deux dates
    Par foxrole dans le forum SAS Base
    Réponses: 3
    Dernier message: 10/07/2013, 16h56
  2. Nombre de jours ouvrés entre deux dates
    Par johnson95 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 17/06/2009, 22h12
  3. [Dates] Nombre de jours ouvrés entre deux date
    Par meufeu dans le forum Langage
    Réponses: 1
    Dernier message: 31/01/2007, 17h50
  4. Réponses: 1
    Dernier message: 10/08/2006, 14h43
  5. [Dates] Nombre jours ouvrés entre deux dates
    Par Yali dans le forum Langage
    Réponses: 4
    Dernier message: 28/12/2005, 12h05

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