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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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