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 :

Date du jour moins un mois (requête SQL)


Sujet :

SQL Oracle

  1. #1
    Invité
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 60
    Points
    60
    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é
    Invité(e)
    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 éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  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 : 60
    Points
    60
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Invité
    Invité(e)
    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...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Voilà ce que j'ai pu faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 60
    Points
    60
    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é
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Invité
    Invité(e)
    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.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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é
    Invité(e)
    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.

Discussions similaires

  1. Réponses: 20
    Dernier message: 27/04/2015, 10h12
  2. Réponses: 7
    Dernier message: 20/02/2015, 10h46
  3. Réponses: 7
    Dernier message: 15/02/2008, 12h36
  4. pb date : nb jours dans un mois
    Par clairette dans le forum Langage
    Réponses: 2
    Dernier message: 26/06/2006, 15h30
  5. Requete SQL sur table dbase et date du jour
    Par Jean-François PETIT dans le forum Bases de données
    Réponses: 5
    Dernier message: 29/03/2005, 09h31

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