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 :

Calculer la Période en fonction du premier Lundi du mois


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut Calculer la Période en fonction du premier Lundi du mois
    Salut à tous,

    Je dois calculer la période pour la société où je fais mon stage, et l’inscrire dans une table de dimension temps. Jusqu’ici ma table est déjà presque complète. Apres correction par mon encadreur, je dois corriger la colonne période qui est encore fausse.

    La période correspond toujours au Nr du mois et est fonction de la position du 1er lundi de ce mois.
    Période 1 = Janvier
    Période 2 = Février
    Période 3 = Mars
    Période 4 = Avril
    Période 5 = Mai

    Période 11 = Novembre
    Période 12 = Décembre

    Le principe de calcul:
    - Le premier lundi du mois est déminant.

    U]Exemple 1[/U]:
    Lundi le 29 septembre 2008 appartient à la semaine du Lundi 29/09/2008 au Dimanche 5/10/2008. Ce qui veut dire que dans ce cas le numéro de la période sera égale au numéro du mois, C a d 9(car mois de septembre)

    Exemple 2 :
    Lundi 6/10/08 appartient à la période 10
    Lundi 27 octobre 2008 au dimanche 2 novembre 2008 -> Période 10(car le lundi est situé dans le mois d’octobre)
    Lundi 29/12/2008 au 4/01/09 -> période 12

    J’ai un début de code. Mais il me renvoie toujours 9.
    Ma question est la suivante : Comment obtenir le premier jour du mois (en lettre ex : Lundi) en Oracle SQL, pour pouvoir faire des comparaison avec le résultat de la fonction « Day » de oracle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE FUNCTION F_MaPeriode(MaDate IN date)
    RETURN NUMBER IS 
    pNr NUMBER := 0;
    	d DATE := trunc(MaDate);
    BEGIN
    	If to_char(MaDate, 'Day') = 'Lundi' THEN  pNr := to_char(MaDate, 'MM');--Jour de la semaine
    	ELSE 
    		pNr := to_char(MaDate, 'MM') -1;
    	end IF;
    	RETURN (pNr);
    END F_ MaPeriode;
    Pouvez vous me donner une piste SVP ? Car je traîne depuis sur ce bout de code et n’avance pas.

    Merci
    Fiona

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Une piste de réflexion pour déterminer le premier lundi du mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select next_day(trunc(sysdate, 'MM'), 'MONDAY') from dual;
    NEXT_DAY(
    ---------
    06-OCT-08

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Je pense que ce n'est pas vraiment par ce biais là qu'il faut attaquer

    Je pense qu'il suffit de trouver le lundi de la semaine de la date

    Avec to_char(ladate, 'D'), tu as le n° du jour dans la semaine (Et parce que ces anglosaxons font toujours tout pas comme les autres, le dimanche est le jour 1)

    Avec ceci, tu retrouves le lundi de la semaine de ta date. Tu peux donc en déduire le mois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ladate, SELECT  ladate - (TO_NUMBER( DECODE(TO_CHAR(ladate, 'D'), 1, 8, TO_CHAR(ladate, 'D'))) - 2)
    FROM tatable
    Sinon autre solution avec la méthode de PlaineR :
    Prendre le prochain lundi et enlever 7 jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT next_day(ladate, 'MONDAY') - 7
    from tatable(

  4. #4
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Salut à tous,

    Pardon aidez moi à ecrire ceci en code pl sql. Je plante un peu, car pas trop d'experience avec les dates en Oracle Pl sql.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF le 1er jour du mois = lundi THEN PNr = Numero du mois et Pour tous les autres jours du mois PNr = Numero du mois
    ELSIF le premier jour du mois != Lundi THEN PNr pour toute cette semaine = Numero du mois passé 
        Et PNr pour les autres jours du mois jusqu'au dernier jour = Numero du mois
    return(PNr)
    J'ai essayé ceci, mais la suite n'est pas évidente pour moi. C'est pour resoudre mon probleme posé plus haut.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION F_MaPeriode(MaDate IN date)
    RETURN NUMBER IS 
        pNr NUMBER := 0;
    	d DATE := trunc(MaDate);
    BEGIN
    	IF TRUNC(SYSDATE, 'MONTH') AND TO_CHAR(SYSDATE, 'DAY') = 'lundi' THEN 
            pNr = to_char(sysdate, 'MM') et Pour tous les autres jours du mois pNr = to_char(sysdate, 'MM'); --Car les autres jours appartiennent à ce mois
        ELSIF TRUNC(SYSDATE, 'MONTH') AND TO_CHAR(SYSDATE, 'DAY') != 'lundi' THEN 
    		PNr pour toute cette semaine = to_char(sysdate, 'MM') - 1;
        	Et PNr pour les autres jours du mois jusqu au dernier jour = to_char(sysdate, 'MM');
        END IF;
    return(pNr)
    END F_ MaPeriode;
    Merci d'avance pour aides
    Fiona

  5. #5
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    C'est beaucoup plus simple que cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace function f1 (pdate in date)
    return number is
    begin
      if pdate < next_day(trunc(pdate, 'MM'),'MONDAY') then
         return extract (month from pdate) - 1;
      else
         return  extract (month from pdate);
      end if;
    end;
    Quelques tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> select f1(to_date('29/09/2008', 'DD/MM/RRRR')) from dual
    F1(TO_DATE('29/09/2008','DD/MM/RRRR'))
    --------------------------------------
                                         9
     
    SQL> select f1(to_date('06/10/2008', 'DD/MM/RRRR')) from dual
    F1(TO_DATE('06/10/2008','DD/MM/RRRR'))
    --------------------------------------
                                        10
     
    SQL> select f1(to_date('02/11/2008', 'DD/MM/RRRR')) from dual
    F1(TO_DATE('02/11/2008','DD/MM/RRRR'))
    --------------------------------------
                                        10

  6. #6
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Citation Envoyé par plaineR Voir le message
    C'est beaucoup plus simple que cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace function f1 (pdate in date)
    return number is
    begin
      if pdate < next_day(trunc(pdate, 'MM'),'MONDAY') then
         return extract (month from pdate) - 1;
      else
         return  extract (month from pdate);
      end if;
    end;
    Salut plaineR,

    un tres grand merci pour la siplification du code. En faisant quelques test, j'ai constaté que le code ne fonctionne pas pour le mois de janvier.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT f1(to_date('01/01/2000', 'DD/MM/RRRR')) FROM dual
     
    Me donne 0 au lieu de 12(car appartient à dezembre 1999)
    F1(TO_DATE('01/01/2000','DD/MM/RRRR'))
    --------------------------------------
                                         0
    Je vais essayer d'introduire une autre condition "elsif" pour voir ce que cela va donner.

    Merci
    Fiona

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Exact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION f1 (pdate IN date)
    RETURN number IS
    begin
      IF pdate < next_day(trunc(pdate, 'MM'),'MONDAY') then
         IF extract (month FROM pdate) = 1 THEN
           return 12;
         ELSE 
           RETURN extract (month FROM pdate) - 1;
         END IF;
      else
         RETURN  extract (month FROM pdate);
      end IF;
    end;

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Désolé d'insister, mais
    IF le 1er jour du mois = lundi
    THEN
    Pour tous les jours du mois PNr = Numero du mois
    ELSIF le premier jour du mois != Lundi
    THEN
    PNr pour toute cette semaine = Numero du mois passé
    Et PNr pour les autres jours du mois jusqu'au dernier jour = Numero du mois
    END IF;
    =
    IF le premier jour du mois != Lundi et Première semaine
    THEN
    PNr = Numero du mois du Lundi
    ELSE
    PNr = Numero du mois
    END IF;
    =
    PNr = Numero du mois du Lundi de la semaine
    =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_CHAR(next_day(ladate, 'MONDAY') - 7, 'MM')
    FROM tatable

  9. #9
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Exact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION f1 (pdate IN date)
    RETURN number IS
    begin
      IF pdate < next_day(trunc(pdate, 'MM'),'MONDAY') then
         IF extract (month FROM pdate) = 1 THEN
           return 12;
         ELSE 
           RETURN extract (month FROM pdate) - 1;
         END IF;
      else
         RETURN  extract (month FROM pdate);
      end IF;
    end;
    Salut plaineR,

    Pardon peux-tu me dire comment vérifier le cas suivant ?

    - Le 1er du mois es t’un lundi?
    Exemple:
    - Lundi 1/09/2008 j’obtient 8 au lieu de 9(car le premier jour du mois est un lundi, et cette semaine appartient entièrement au mois de septembre)

    - Lundi 01/12/2008 j’obtient 11 au lieu de 12(car le premier jour du mois est un lundi, et car cette semaine appartient entièrement au mois de décembre)

    Merci
    Fiona

  10. #10
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Citation Envoyé par McM Voir le message
    Désolé d'insister, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_CHAR(next_day(ladate, 'MONDAY') - 7, 'MM')
    FROM tatable
    Salut McM,

    excuse moi(je suis nouvelle dans le plSql), mais je ne comprend pas ton code. Peux-tu me donner quelques explications?

    Merci d'avance
    Fiona
    J’apprend encore : Excusez moi si mes questions paraissent peut être bête ou triviale.

  11. #11
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    next_day(tadate, 'MONDAY') : Donne le prochain lundi à partir de tadate.

    -7 => Enlève 7 jour par rapport au prochain lundi => Egal au lundi de la semaine de tadate.

    Edit : On aurait pu faire un TRUNC(LADATE, 'DAY'), mais c'est fonction du pays (les Anglais commencent le dimanche)

    TO_CHAR(.., 'MM') => Donne le n° du mois de la date (en varchar2)

  12. #12
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Salut plaineR, McM, skuatamad, orafrance, et tous les autres,

    1000 * merci. C’est dommage qu’il n’existe pas de simley pour faire des courbettes, mais sachez que je me plie devant votre savoir.

    J’espère pouvoir être un jour aussi expérimenté.

    Merci
    Fiona
    "c’est en forgeant qu’on devient forgeron"

  13. #13
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Il en existait avant.

    Bon si le post est résolu, il faut que tu cliques sur (en bas je crois)

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

Discussions similaires

  1. Exécution hebdomadaire d'un .bat sauf le premier Lundi du mois
    Par zainab2000 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 10/03/2011, 20h33
  2. premier lundi du mois
    Par mickisa dans le forum Excel
    Réponses: 3
    Dernier message: 16/06/2010, 12h58
  3. Premier Lundi du mois
    Par PrinceMaster77 dans le forum ASP
    Réponses: 1
    Dernier message: 26/03/2008, 17h48
  4. Executer une action premier lundi chaque mois
    Par Pierren dans le forum Access
    Réponses: 1
    Dernier message: 15/01/2007, 20h07
  5. Premier lundi du mois
    Par bloowind dans le forum C++
    Réponses: 10
    Dernier message: 23/06/2006, 08h38

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