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 :

Découper une période [Oracle 9i]


Sujet :

SQL Oracle

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut Découper une période [Oracle 9i]
    Bonjour.

    J'ai une période définie par 2 dates d'une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT datedebut, datefin FROM matable
    Je voudrais ramener une série de périodes de 4 jours, puis 3 jours en alternance (sachant que la période totale est un multiple de 7).
    Le résultat serait donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Période1: datedebut, datedebut+3
    Période2: datedebut+5, datedebut+7
    Période3: datedebut+8, datedebut+11
    ...
    ...
    Dernière période: datefin-2, datefin
    NB: attention aux bornes.

    Je cherche en même temps, mais je sèche sur la fonction à utiliser.
    Merci.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il faut multiplier le données de départ autant de fois qu'il y a des périodes de 7 jours multiplié par le nombres des intervalles de sous-division de ces 7 jours (2 dans ce cas).
    Donc on utilise une table pivot et qui dans ce cas multiplie 10 fois chaque enregistrements et ensuite on filtre par rapport aux besoins. Après il reste ne reste à faire qu'un peu d'arithmétique avec ces dates ( si je me suis trompé sur les bornes vous allez me pardonner j'espère).
    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
     
    mni@DIANA> with pivot as (
      2    Select level x from dual connect by level <= 10
      3  ), Data as (
      4    Select 1 id, sysdate datdeb, sysdate + 7*3 datfin from dual union all
      5    Select 2 id, sysdate datdeb, sysdate + 7*2 datfin from dual
      6  )
      7  Select id, datdeb, x, round(x/2),
      8     datdeb + (round(x/2)-1)*7 + case when mod(x,2) = 1 Then 0 Else 4 End debper,
      9     datdeb + (round(x/2)-1)*7 + case when mod(x,2) = 1 Then 3 Else 6 End finper
     10    from data, pivot
     11  where x <= (datfin-datdeb)/7*2
     12  order by id, x
     13  /
     
            ID DATDEB            X ROUND(X/2) DEBPER   FINPER
    ---------- -------- ---------- ---------- -------- --------
             1 19/03/09          1          1 19/03/09 22/03/09
             1 19/03/09          2          1 23/03/09 25/03/09
             1 19/03/09          3          2 26/03/09 29/03/09
             1 19/03/09          4          2 30/03/09 01/04/09
             1 19/03/09          5          3 02/04/09 05/04/09
             1 19/03/09          6          3 06/04/09 08/04/09
             2 19/03/09          1          1 19/03/09 22/03/09
             2 19/03/09          2          1 23/03/09 25/03/09
             2 19/03/09          3          2 26/03/09 29/03/09
             2 19/03/09          4          2 30/03/09 01/04/09
     
    10 ligne(s) sÚlectionnÚe(s).

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut


    Ca a l'air bien, sauf que...... je n'ai pas l'habitude d'utiliser les pivots , ni d'utiliser des formules que je ne comprends pas.
    Je vais donc étudier cela de près, mon côté matheux devrait m'aider.

    Merci en tout cas.

    EDIT: à quoi sert le "UNION ALL SELECT 2..."? Si je l'enlève, j'ai exactement le résultat sans lignes en trop.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    C'est bon, j'ai compris.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il y a toujours une deuxième solution qui n’utilise pas les pivots. L’idée est d’utiliser une « pipelined function » qui « fabrique » les lignes en fonction des besoins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create or replace function f_pipel(p_in ...) return table_type pipelined Is
    begin
      select datdeb, datfin Into ... from ma_table Where ...
      For i in datfin - datdeb ... Loop
        ...
        pipe row(scalar_type(id, datdeb, datfin));
      End Loop
    ...
    end;
    et de l’utiliser ensuite de la façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SelectFrom Table(f_pipel(param))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Perte de mes connexions Oracle après une période d'inactivité
    Par thierryler dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 17/12/2012, 14h33
  2. Découper une période temporelle
    Par iReporter dans le forum BIRT
    Réponses: 2
    Dernier message: 23/05/2011, 15h53
  3. Découper une période en jours
    Par dom67 dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 01/11/2009, 10h39
  4. Réponses: 4
    Dernier message: 03/03/2004, 11h04
  5. [Tomcat]Connexion à une DataSource Oracle
    Par iceman dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 04/08/2003, 16h48

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