+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Invité régulier
    Étudiant
    Inscrit en
    mars 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2010
    Messages : 33
    Points : 8
    Points
    8

    Par défaut Date du jour moins un mois (requête SQL)

    Bonjour à tous.
    Voilà mon problème.
    J'ai une requête SQL dans laquelle j'ai une condition:
    Code :
    MV_CONS_MOIS.ANNEE_MOIS = à partir de la (date du jour) -1 mois , format YYYYMM
    Le problème ici c'est que j'essaye de comparer des chiffres, car ANNEE_MOIS est déclarée en number et est de la forme YYYYMM, à un format date.
    Je me demande donc comment convertir ce number en format date.
    Après, je sais que l'on récupère la date du jour année et mois comme je le souhaite avec ce qui donnerai
    Code :
    MV_CONS_MOIS.ANNEE_MOIS = (sysdate, 'YYYYMM')
    une fois que ANNEE_MOIS serait converti en date.

    Mais comment lui dire moins un mois ?
    Et j'ai aussi une contrainte, si date jour – 1 mois = Mois d’août, on recule jusqu’en juillet.

    J'espère m'être bien exprimé.
    Merci d'avance.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : novembre 2008
    Messages : 46
    Points : 54
    Points
    54

    Par défaut

    Bonjour,

    Pour les conversions vous devriez jeter un oeil a cette page. Plus precisemment les fonctions TO_CHAR et TO_DATE pour votre probleme :
    http://download.oracle.com/docs/cd/B...001.htm#i88892

    Concernant les mois a soustraire, la fonction ADD_MONTHS fera l'affaire.

  3. #3
    Invité régulier
    Étudiant
    Inscrit en
    mars 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2010
    Messages : 33
    Points : 8
    Points
    8

    Par défaut

    Merci.
    Je vais regarder ça de suite.
    Si un nouveau problème se pose je viendrais ici !

  4. #4
    McM
    McM est déconnecté
    Expert Confirmé Sénior
    Inscrit en
    juillet 2003
    Messages
    3 666
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 3 666
    Points : 5 065
    Points
    5 065

    Par défaut

    Attention à ADD_MONTHS qui, lorsque tu donnes le dernier jour d'un mois te renverra le dernier jour d'un mois.

    Code :
    1
    2
    3
    4
    5
    SELECT ADD_MONTHS(TO_DATE('28/02/2010', 'DD/MM/RRRR'), 1) next_month
    FROM dual
     
    next_month
    31/03/2010
    More Code : More Bugs. Less Code : Less Bugs

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : novembre 2008
    Messages : 46
    Points : 54
    Points
    54

    Par défaut

    Attention à ADD_MONTHS qui, lorsque tu donnes le dernier jour d'un mois te renverra le dernier jour d'un mois.
    Ce qui est correcte lorsque l'on raisonne en mois. De meme que la fonction retournera le premier jour du mois suivant si on lui donne le premier jour d'un mois en parametre.

    Code sql :
    1
    2
    3
    4
    5
    SQL> SELECT add_months(to_date('01/01/2010' , 'dd/mm/yyyy') , 1) as ma_date FROM dual ;
     
    MA_DATE
    -----------
    01/02/2010

  6. #6
    Expert Confirmé Sénior Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 932
    Points : 5 235
    Points
    5 235

    Par défaut

    Citation Envoyé par Jorafali Voir le message
    Ce qui est correcte lorsque l'on raisonne en mois.
    Oui ? C'est une logique toute relative et fort discutable, tout de même... Ajouter un mois au 28 février et tomber sur le 31 mars...
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
    (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.
    Écrire en français sur un forum est une marque minimale de respect.

  7. #7
    Invité régulier
    Étudiant
    Inscrit en
    mars 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2010
    Messages : 33
    Points : 8
    Points
    8

    Par défaut

    Voilà ce que j'ai pu faire:
    Code :
    1
    2
    where ((TO_DATE(MV_CONS_MOIS.ANNEE_MOIS, 'YYYYMM') = TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, -3), 'YYYYMM'), 'YYYYMM') and TO_CHAR(SYSDATE, 'MM') <> '09')
    	or (TO_DATE(MV_CONS_MOIS.ANNEE_MOIS, 'YYYYMM') = TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, -4), 'YYYYMM'), 'YYYYMM') and TO_CHAR(SYSDATE, 'MM') = '09'))
    Malheureusement le décalage ne se fait pas avec ma condition.
    Je voudrais qu'au mois de septembre (vu que je recule d'un mois) je visionne juillet et non aout.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : novembre 2008
    Messages : 46
    Points : 54
    Points
    54

    Par défaut

    Poster la requete complete ou un exemple de la logique utilise serait appreciable.

    Et utiliser des alias plus court dans votre requete rendrait le code beaucoup plus lisible.

    Oui ? C'est une logique toute relative et fort discutable, tout de même... Ajouter un mois au 28 février et tomber sur le 31 mars...
    On doit pas avoir la meme definition du mois ... je ne vois que ca.
    Que devrait retourner cette fonction d'apres vous ?

  9. #9
    Invité régulier
    Étudiant
    Inscrit en
    mars 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2010
    Messages : 33
    Points : 8
    Points
    8

    Par défaut

    Oui ? C'est une logique toute relative et fort discutable, tout de même... Ajouter un mois au 28 février et tomber sur le 31 mars...
    Toute façon le problème n'est pas là pour moi puisque je ne m'occupe pas des jours, uniquement de l'année et du mois.

    Je trouve que mes alias sont déjà assez court je ne peux pas faire mieux.
    Je ne pense pas que la requête entière puisse vous aider mais si cela est le que je te remercierai volontier.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select 
    	  GCO_GOOD.GCO_GOOD_ID, 
    	  GCO_GOOD.GOO_MAJOR_REFERENCE, 
    	  GCO_GOOD.GOO_SECONDARY_REFERENCE,
    	  MV_CONS_MOIS.ANNEE_MOIS,
    	  ((nvl(MV_CONS_MOIS.QTE_CONS,0))) as CONS_Mm1 from 
    	  GCO_GOOD, 
    	  MV_CONS_MOIS 
    where ((TO_DATE(MV_CONS_MOIS.ANNEE_MOIS, 'YYYYMM') = TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, -3), 'YYYYMM'), 'YYYYMM') and TO_CHAR(SYSDATE, 'MM') <> '09')
    	or (TO_DATE(MV_CONS_MOIS.ANNEE_MOIS, 'YYYYMM') = TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, -4), 'YYYYMM'), 'YYYYMM') and TO_CHAR(SYSDATE, 'MM') = '09'))
    	and GCO_GOOD.GCO_GOOD_ID =  MV_CONS_MOIS.GCO_GOOD_ID (+)
    Quant à la logique je ne peux pas vous en apprendre beaucoup je suis en alternance dans cette entreprise depuis le début de l'année donc je ne connais pas bien leur base de données.
    Je peux vous dire que MV_% est une vue matérialisée
    GOO_MAJOR_REFERENCE est un n° de produit

    En espérant que cela peut vous aider et ainsi me venir en aide.

  10. #10
    Expert Confirmé Sénior Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 932
    Points : 5 235
    Points
    5 235

    Par défaut

    Citation Envoyé par Jorafali Voir le message
    Que devrait retourner cette fonction d'apres vous ?
    Dans mon livre à moi, 28 février + 1 mois = 28 mars.
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
    (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.
    Écrire en français sur un forum est une marque minimale de respect.

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 6 914
    Points : 14 393
    Points
    14 393

    Par défaut

    Votre jointure externe est inutile, vous la faites sauter dans vos conditions.

    Il vaut mieux ne pas appliquer de fonctions aux colonnes mais aux constantes : l'évaluation est plus rapide et permet de profiter des éventuels partitionnement / index.

    Votre requête peut s'écrire ainsi :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT goo.GCO_GOOD_ID, 
           goo.GOO_MAJOR_REFERENCE, 
           goo.GOO_SECONDARY_REFERENCE,
           cmo.ANNEE_MOIS,
           nvl(cmo.QTE_CONS, 0) AS CONS_Mm1
      FROM GCO_GOOD goo
           INNER JOIN MV_CONS_MOIS cmo
             ON cmo.GCO_GOOD_ID = goo.GCO_GOOD_ID
    WHERE cmo.ANNEE_MOIS = to_number(to_char(case extract(month from sysdate)
                                               when 9
                                               then ADD_MONTHS(trunc(sysdate, 'mm'), -2)
                                               else ADD_MONTHS(trunc(sysdate, 'mm'), -1)
                                             end, 'yyyymm'));
    Le case peut faire un peu peur par contre, donc prenez bien le temps de l'analyser, pour vous y aider voici son résultat sur tous les mois de l'année 2010 :
    Code :
    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
    With CalMon as
    (
    select add_months(date '2010-01-01', level-1) as mois
      from dual
    connect by level <= 12 
    )
    select mois,
           to_number(to_char(
           case extract(month from mois)
             when 9
             then ADD_MONTHS(trunc(mois, 'mm'), -2)
             else ADD_MONTHS(trunc(mois, 'mm'), -1)
           end, 'yyyymm')) as mois_prec
      from CalMon;
     
    MOIS        MOIS_PREC
    ---------- ----------
    01/01/2010     200912
    01/02/2010     201001
    01/03/2010     201002
    01/04/2010     201003
    01/05/2010     201004
    01/06/2010     201005
    01/07/2010     201006
    01/08/2010     201007
    01/09/2010     201007
    01/10/2010     201009
    01/11/2010     201010
    01/12/2010     201011

  12. #12
    Invité régulier
    Étudiant
    Inscrit en
    mars 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2010
    Messages : 33
    Points : 8
    Points
    8

    Par défaut

    Bonjour,
    Merci pour ton explication.
    C'est clair que c'est un peu plus compliquer à comprendre que ma requête !
    En faite ma requête était bonne c'est juste que vu qu'on est au mois de novembre 11 je ne pouvais pas avoir de décalage vu que je lui disais de le faire quand le mois est celui de septembre 09 !
    Sinon ça fonctionne

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •