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 :

Question Utilisation ADD_MONTHS [11g]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut Question Utilisation ADD_MONTHS
    Bonjour,

    Je suis nouvelle sur le site et un peu rouillée en SQL
    Mon besoin est qu'il faudrait sur la liste de valeur ci-dessous, que je récupère uniquement pour cet objet les -10derniers mois.
    Pour cela il faut que je me base sur la date la plus récente de mon objet (et non pas en me basant sur le sysdate, initialement prévus pour le ADD_MONTHS) et récupère les 10derniers mois.

    Liste de valeur complète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select * from matable where champdate> add_months(sysdate),-10) and champ ='TEST1';
    champ champdate
    TEST1 2014-03-11-16.07.06
    TEST1 2014-03-11-16.12.50
    TEST1 2014-03-11-16.12.50
    TEST1 2015-01-14-18.35.06
    TEST1 2015-01-14-18.38.34
    TEST1 2015-01-14-18.38.34
    TEST1 2017-02-16-10.51.50
    TEST1 2017-02-16-11.06.34
    TTEST1 2017-02-16-11.06.34
    Résultat souhaité:
    champ champdate
    ----------------------
    TEST1 2017-02-16-10.51.50
    TEST1 2017-02-16-11.06.34
    TEST1 2017-02-16-11.06.34

    Requete que j'essaie de mettre en place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    set serveroutput on
    declare
    	date_max date;
    	begin
    		select max(champdate) into date_max from matable  where champ ='TEST1'
    	UNION ALL
    		select champdate from matable   where champdatefrom > add_months(date_max,-10) and champ ='TEST1';
    	DBMS_OUTPUT.PUT_LINE('var_max =' || date_max);
    end;
    /
    var_max =2017-02-16-11.06.34
     
    PL/SQL procedure successfully completed.
    Merci pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Donc si l'on récapitule, il s'agit de récupérer le MAX du champs date (Valable aussi si supérieur à date du jour ?) et de récupérer les enregistrements qui y sont antérieurs jusqu'à 10 mois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT champdate 
    FROM matable
      INNER JOIN    
        (SELECT champ AS Chp, MAX(champdate) AS LAST_Date
        FROM matable
        WHERE champ = 'TEST1'
        GROUP BY champ
        )
       ON champ = Chp
    WHERE champdate > add_months(LAST_Date,-10) 
    ;

  3. #3
    Membre confirmé
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    Merci pour votre aide
    Voilà la solution que j'ai trouvé et qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set serveroutput on
    set echo on
    declare
    date_max date;
    	begin
    		select max(champdate) into date_max from matable  where champ ='TEST1'
    		execute immediate 'delete from matable where champdate < add_months('''||date_max||''',-10) and champ =''TEST1''';
    end;
    /

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Ici le SQL dynamique n'a aucun intérêt.
    Par ailleurs en utilisant le SQL dynamique vous générez des conversions implicites à la construction de la requête puis à l'exécution.

    => Pas besoin de execute immediate.

  5. #5
    Expert confirmé 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
    Par défaut
    Via les fonctions de fenêtrage (analytiques)
    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
     
    With Data As (
      Select 'TEST1' As champ, To_Date('2014-03-11-16.07.06','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2014-03-11-16.12.50','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2014-03-11-16.12.50','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2015-01-14-18.35.06','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2015-01-14-18.38.34','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2015-01-14-18.38.34','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2017-02-16-10.51.50','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2017-02-16-11.06.34','YYYY-MM-DD-HH24:MI:SS') As champdate from dual union all
      Select 'TEST1' As champ, To_Date('2017-02-16-11.06.34','YYYY-MM-DD-HH24:MI:SS') As champdate from dual
    ),
    Data_with_max As (
    Select champ, champdate, Max(champdate) over (partition by champ) maxdate
      from Data
    )
    Select champ, champdate
      from  Data_with_max
     where champdate >  Add_months(maxdate, -10)
     order by champdate

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 19/02/2009, 14h49
  2. question utilisation RANK
    Par stephyugh dans le forum DB2
    Réponses: 1
    Dernier message: 08/07/2008, 17h49
  3. Réponses: 2
    Dernier message: 18/04/2007, 11h55
  4. [REGEXP] Question Utilisation fonction replace
    Par calitom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/03/2007, 17h39
  5. Question Utilisation cpu
    Par devdev2003 dans le forum Administration système
    Réponses: 4
    Dernier message: 03/12/2005, 17h01

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