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

PL/SQL Oracle Discussion :

Trouver le nombre de jours de WE entre deux dates variables


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 344
    Points : 104
    Points
    104
    Par défaut Trouver le nombre de jours de WE entre deux dates variables
    Bonjour,
    J'ai une requête basique avec deux champs dates au format dd/mm/yyyy.
    Je souhaite dans un troisième champ indiquer le nombre de samedi+dimanche entre ces deux dates.
    Par ex si ma date1 est le jeudi 3 avril et ma date2 est le lundi 7 avril, je dois trouver 2 dans ce champ car on a un samedi et un dimanche entre les 2 dates.
    Merci pour votre aide

    Laurent

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 098
    Points : 28 409
    Points
    28 409
    Par défaut
    Montre-nous la requête sur laquelle tu travailles pour que nous puissions t'aider à l'améliorer.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    On peut faire comme ça, attention il faut un identifiant unique pour chaque ligne, dans mon exemple c'est PK :
    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
    SQL>   with data_exemple as (
      2  select 1 as pk, to_date('03/04/2014','DD/MM/YYYY') as date_deb, to_date('07/04/2014','DD/MM/YYYY') as date_fin from dual union all
      3  select 2 as pk, to_date('06/05/2014','DD/MM/YYYY') as date_deb, to_date('27/05/2014','DD/MM/YYYY') as date_fin from dual
      4  ),
      5          liste_date as (
      6   select t.*, to_char(date_deb + rownum, 'FMDAY', 'NLS_DATE_LANGUAGE=FRENCH') as date_jour
      7     from data_exemple t
      8  connect BY level <= t.date_fin - t.date_deb + 1
      9      AND PRIOR pk = pk
     10      AND prior sys_guid() IS NOT NULL
     11  )
     12  select date_deb, date_fin, sum(case when date_jour in ('SAMEDI', 'DIMANCHE') then 1 end) as nb_jour_we
     13    from liste_date
     14   group by date_deb, date_fin;
     
    DATE_DEB DATE_FIN NB_JOUR_WE
    -------- -------- ----------
    06/05/14 27/05/14          6
    03/04/14 07/04/14          2
     
    SQL>

  4. #4
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    Octobre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'étude PL/SQL

    Informations forums :
    Inscription : Octobre 2002
    Messages : 53
    Points : 69
    Points
    69
    Par défaut
    En analysant ta solution je pense qu'il manque un -1 a tes rownum
    et je ne comprends pas la valeur réelle des date (val jour)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH data_exemple AS (
        SELECT  1 AS pk,to_date('03/04/2014','DD/MM/YYYY') AS date_deb, to_date('07/04/2014','DD/MM/YYYY') AS date_fin FROM dual union ALL
        SELECT  2 AS pk,to_date('06/05/2014','DD/MM/YYYY') AS date_deb, to_date('27/05/2014','DD/MM/YYYY') AS date_fin FROM dual
        ),
         liste_date AS (
         SELECT t.*, to_char(date_deb + rownum-1, 'FMDAY', 'NLS_DATE_LANGUAGE=FRENCH') AS date_jour, date_deb + rownum-1 as val_jour
        FROM data_exemple t
        connect BY level <= t.date_fin - t.date_deb + 1
        --connect BY t.date_deb + (rownum - 1) <= t.date_fin
        and prior pk =pk
        AND prior sys_guid() IS NOT NULL
           )
           select * from liste_date
    pour le 2e intervalle , ça va du 11/05/2014 à 01/06/2014
    il y a un truc qui ne va pas ou je n'ai pas tout compris , ce qui est fort possible

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    Oui il manquait un -1 mais en fait je me suis planté, il faut utiliser row_number et pas rownum :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    SQL>   WITH data_exemple AS (
      2  SELECT 1 AS pk, to_date('03/04/2014','DD/MM/YYYY') AS date_deb, to_date('07/04/2014','DD/MM/YYYY') AS date_fin FROM dual union ALL
      3  SELECT 2 AS pk, to_date('06/05/2014','DD/MM/YYYY') AS date_deb, to_date('27/05/2014','DD/MM/YYYY') AS date_fin FROM dual
      4  ),
      5         liste_date AS (
      6   SELECT t.*, to_char(date_deb + row_number() over (partition by pk order by 1) -1, 'FMDAY', 'NLS_DATE_LANGUAGE=FRENCH') AS date_jour, date_deb + row_number() over (partition by pk order by 1) -1 AS val_jour
      7     FROM data_exemple t
      8  connect BY level <= t.date_fin - t.date_deb + 1
      9      AND PRIOR pk = pk
     10      AND prior sys_guid() IS NOT NULL
     11  )
     12  select * from liste_date;
     
            PK DATE_DEB DATE_FIN DATE_JOUR                        VAL_JOUR
    ---------- -------- -------- -------------------------------- --------
             1 03/04/14 07/04/14 JEUDI                            03/04/14
             1 03/04/14 07/04/14 VENDREDI                         04/04/14
             1 03/04/14 07/04/14 SAMEDI                           05/04/14
             1 03/04/14 07/04/14 DIMANCHE                         06/04/14
             1 03/04/14 07/04/14 LUNDI                            07/04/14
             2 06/05/14 27/05/14 MARDI                            06/05/14
             2 06/05/14 27/05/14 MERCREDI                         07/05/14
             2 06/05/14 27/05/14 JEUDI                            08/05/14
             2 06/05/14 27/05/14 VENDREDI                         09/05/14
             2 06/05/14 27/05/14 SAMEDI                           10/05/14
             2 06/05/14 27/05/14 DIMANCHE                         11/05/14
     
            PK DATE_DEB DATE_FIN DATE_JOUR                        VAL_JOUR
    ---------- -------- -------- -------------------------------- --------
             2 06/05/14 27/05/14 LUNDI                            12/05/14
             2 06/05/14 27/05/14 MARDI                            13/05/14
             2 06/05/14 27/05/14 MERCREDI                         14/05/14
             2 06/05/14 27/05/14 JEUDI                            15/05/14
             2 06/05/14 27/05/14 VENDREDI                         16/05/14
             2 06/05/14 27/05/14 SAMEDI                           17/05/14
             2 06/05/14 27/05/14 DIMANCHE                         18/05/14
             2 06/05/14 27/05/14 LUNDI                            19/05/14
             2 06/05/14 27/05/14 MARDI                            20/05/14
             2 06/05/14 27/05/14 MERCREDI                         21/05/14
             2 06/05/14 27/05/14 JEUDI                            22/05/14
     
            PK DATE_DEB DATE_FIN DATE_JOUR                        VAL_JOUR
    ---------- -------- -------- -------------------------------- --------
             2 06/05/14 27/05/14 VENDREDI                         23/05/14
             2 06/05/14 27/05/14 SAMEDI                           24/05/14
             2 06/05/14 27/05/14 DIMANCHE                         25/05/14
             2 06/05/14 27/05/14 LUNDI                            26/05/14
             2 06/05/14 27/05/14 MARDI                            27/05/14
     
    27 rows selected.
     
    SQL>

Discussions similaires

  1. [VxiR2] Calcul du nombre de jours par mois entre deux date
    Par trabelsi dans le forum Designer
    Réponses: 4
    Dernier message: 02/10/2017, 15h17
  2. [XL-2003] Compter le nombre de jours par mois entre deux dates
    Par Mikayel dans le forum Excel
    Réponses: 8
    Dernier message: 23/09/2016, 13h36
  3. calculer le nombre de jour,moi,annee entre deux dates
    Par kroma23 dans le forum Débuter
    Réponses: 2
    Dernier message: 13/12/2011, 11h49
  4. Calcul du nombre de jours non ouvrés entre deux dates
    Par allweneed dans le forum Oracle
    Réponses: 6
    Dernier message: 27/04/2010, 17h34
  5. [AC-2007] Calcul du nombre de jours par mois entre deux dates
    Par arouxy dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2010, 08h34

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