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 :

pb requete avec date


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut pb requete avec date
    Bonjour,

    après avoir créer une requete selon plusieurs critères, cette dernière me donne les données que je souhaite mais il me faut faire un dernier tri sur un champ date. (avec une condition comme IF, par exemple).
    Est ce possible avec une requete SQL simple ou faut il passer par pl/sql ?

    PS : mes conditions à rajouter sont du type :
    IF DATSSE>'&date1' THEN NBJOUR:=('&date2'-DATESE)+1;
    ELSEIF DATSSE BETWEEN '&date1' AND '&date2' THEN NBJOUR:=(DATSSE-DATESE)+1;
    END IF;

    Merci de vos renseignements.

  2. #2
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Bonjour,

    Quelle est votre requete initiale et que voulez-vous ajouter comme critére de tri ?

    LBO72.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    voici ma requete:

    spool GIR.lst
    rem accept date1 prompt 'ENTRER LA DATE DE DEBUT DE SELECTION (JJMMAA) : '
    rem accept date2 prompt 'ENTRER LA DATE DE FIN DE SELECTION (JJMMAA) : '
    SELECT CHAMP1,CHAMP2,DATEE,DATES,CHAMP3,CHAMP4,CHAMP5
    FROM SEJ,UFM
    WHERE NUUFSE=NUFMUF
    AND CHAMP2 IS NOT NULL
    AND DATES IN ('1/1/07', '31/12/99')
    AND CHAMP4 IN ('1/1/07', '1/12/04');
    spool off


    je souhaiterais intégrer à ma requete un champ calculé (NBJOUR) qui donnerait le nb de jour séparant 2 dates.
    par exemple, l'instruction if conviendrait avec ces paramètres (enfin je pense):
    IF DATES>'&date2' THEN NBJOUR:=('&date2'-DATEE)+1;
    ELSEIF DATES BETWEEN '&date1' AND '&date2' THEN NBJOUR:=(DATES-DATEE)+1;
    END IF;

    Merci de vos renseignements.

  4. #4
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Salut,

    Je pense que vous êtes obligé de le faire dans du plsql et d'utiliser du sql dynamique.

    LBO72.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    est ce que cette requete conviendrait ?

    spool GIR.lst
    accept date1 prompt 'ENTRER LA DATE DE DEBUT DE SELECTION (JJMMAA) : '
    accept date2 prompt 'ENTRER LA DATE DE FIN DE SELECTION (JJMMAA) : '
    DECLARE
    NBJOUR NUMBER;
    BEGIN
    SELECT NUHOSE,NGIRSE,DATESE,DATSSE,LBRMUF,DAEFUF,NBJOSE
    IF DATSSE>'&date1' THEN NBJOUR:=('&date2'-DATESE)+1;
    ELSEIF DATSSE BETWEEN '&date1' AND '&date2' THEN NBJOUR:=(DATSSE-DATESE)+1;
    END IF;
    FROM SEJ,UFM
    WHERE NUUFSE=NUFMUF
    AND NGIRSE IS NOT NULL
    AND DATSSE IN ('1/1/07', '31/12/99')
    AND DAEFUF IN ('1/1/07', '1/12/04');
    END;
    spool off

  6. #6
    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
    (le # dans le menu d'edition des messages)

  7. #7
    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
    Citation Envoyé par LBO72 Voir le message
    Salut,

    Je pense que vous êtes obligé de le faire dans du plsql et d'utiliser du sql dynamique.

    LBO72.
    Fatigué LBO ? Avec un CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT nuhose,ngirse,datese,datsse,lbrmuf,daefuf,nbjose
    	(CASE WHEN datsse>'&date1' THEN '&date2'-datese +1
    		WHEN datsse BETWEEN '&date1' AND '&date2' THEN datsse-datese+1
    		ELSE NULL
    	END ) AS nbjour
    FROM SEJ,UFM
    WHERE nuufse=nufmuf
    AND ngirse IS NOT NULL
    AND datsse IN ('1/1/07', '31/12/99')
    AND daefuf IN ('1/1/07', '1/12/04');

  8. #8
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    McM
    Fatigué LBO ? Avec un CASE :

    C'est sûrement ça


    SELECT nuhose,ngirse,datese,datsse,lbrmuf,daefuf,nbjose,
    (CASE WHEN datsse>'&date1' THEN '&date2'-datese +1
    WHEN datsse BETWEEN '&date1' AND '&date2' THEN datsse-datese+1
    ELSE NULL
    END ) AS nbjour
    FROM SEJ,UFM
    WHERE nuufse=nufmuf
    AND ngirse IS NOT NULL
    AND datsse IN (to_date('1/1/07','DD/MM/YY'), to_date('31/12/99','DD/MM/YY'))
    AND daefuf IN (to_date('1/1/07','DD/MM/YY', to_date('01/12/04', 'DD/MM/YY'));

    Pour une question de portabilité.
    On peut aussi utiliser un IF ou un DECODE pour répondre au PB


  9. #9
    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
    IF dans un SELECT, je crois pas.
    Pour le décode, mouais, c'est moins lisible, surtout le between.

  10. #10
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    Merci de vos réponses. Après l'avoir testé, j'obtiens cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ENTRER LA DATE DE DEBUT DE SELECTION (JJMMAA) :
    ENTRER LA DATE DE  FIN  DE SELECTION (JJMMAA) :
    Entrée limitée à 9 caractères
     16  
     17  
     18  
     19  
     
    SQL> spool off
    SQL>
    en faisant CTRL-C puis spool off, je reprends la main.j'ai du oublié un "petit" détail....
    Avez vous une idée ?

  11. #11
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    après recherches, la fonction CASE ne fonctionne pas sous oracle 8 (qui est ma version) je l'ai donc remplacé par IF.
    mais cette dernière ne fonctionne pas non plus

    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
    spool GIR.lst
    accept date1 prompt 'ENTRER LA DATE DE DEBUT DE SELECTION (JJ/MM/AA) : '
    accept date2 prompt 'ENTRER LA DATE DE  FIN  DE SELECTION (JJ/MM/AA) : '
    DECLARE
    nbjour number;
    BEGIN
    SELECT nuhose,ngirse,datese,datsse,lbrmuf,daefuf,nbjose,nbjour
    FROM SEJ,UFM
    WHERE nuufse=nufmuf
    AND ngirse IS NOT NULL
    AND datsse IN (to_date('1/1/07','DD/MM/YY'), to_date('31/12/99','DD/MM/YY'))
    AND daefuf IN (to_date('1/1/07','DD/MM/YY'), to_date('01/12/04', 'DD/MM/YY'));
    	IF datsse > '&date2' THEN
    		nbjour:=('&date2'-'&date1')+1;
    	ELSE
    		nbjour:=(datsse - '&date1') +1;
    	END IF;
    END;
    /
    spool off
    je rencontre les erreurs suivantes:
    ERREUR à la ligne 4 :
    ORA-06550: line 4, column 1:
    PLS-00428: an INTO clause is expected in this SELECT statement
    ORA-06550: line 4, column 1:
    PL/SQL: SQL Statement ignored
    ORA-06550: line 10, column 5:
    PLS-00201: identifier 'DATSSE' must be declared
    ORA-06550: line 10, column 2:
    PL/SQL: Statement ignored

    je souhaite retourner plusieurs valeurs et le select into ne m'en retournera qu'une seule.
    Si vous avez une idée...

  12. #12
    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
    1/ Tu aurais du donner ta version en premier
    2/ Tu ne peux pas mélanger du SQL et du PL/SQL. Pour info si tu voulais faire ton spool avec des IF, il faut insérer chaque ligne dans une table temporaire, puis faire un spool de cette table temporaire.

    3/ Voici le code avec des decode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT nuhose,ngirse,datese,datsse,lbrmuf,daefuf,nbjose
    	DECODE (SIGN(datsse - '&date1'), 1, '&date2'-datese +1,	-- Datsse > &date1 
     		DECODE(SIGN(datsse - '&date2'), -1, NULL,	-- Datsse < &date2 
    			datsse-datese+1)) AS nbjour	-- datsse <= &date1 et datsse >= &date2
    FROM SEJ,UFM
    WHERE nuufse=nufmuf
    AND ngirse IS NOT NULL
    AND datsse IN ('1/1/07', '31/12/99')
    AND daefuf IN ('1/1/07', '1/12/04');

  13. #13
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    j'ai pu relancer la requete mais avec une erreur :

    DECODE (SIGN(datsse - '01/01/07'), 1, '31/01/07'-datese +1,
    *
    ERREUR à la ligne 2 :
    ORA-00932: inconsistent datatypes

    la soustraction entre date est possible et je ne vois pas d'où peut venir le pb...

  14. #14
    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
    Simplement que tu mets '1/12/07' qui est une chaine de caractère au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_DATE('1/12/07', 'DD/MM/RR')

  15. #15
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    petit à petit j'avance. effectivement, en rajoutant TO_DATE la requete s'exécute mais les résultats dans la colonne nbjour sont faux...

    677026658 4 16/03/07 31/12/99 BATIM101/01/07 -43

  16. #16
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    j'ai les resultats suivants :

    DATESE DATSSE
    677026658 4 16/03/07 31/12/99 BATIM1 01/01/07 -43
    77026694 1 26/03/07 31/12/99 BATIM1 01/01/07 -53

    Les conditions que je souhaite poser sont :
    - Si DATSSE > &date2
    - Si DATSSE entre &date1 AND &date2

    j'avoue etre perdu dans la ligne du DECODE. quelqu'un pourrait il m'expliquer l'enchainement + le SIGN.
    Merci.

  17. #17
    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
    Attention au bug de l'an 2000 (Année sur 2 chiffres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TO_DATE('31.12.99', 'DD.MM.RR')
    FROM dual
    31/12/1999
     
    SELECT TO_DATE('31.12.99', 'DD.MM.YY')
    FROM dual
    31/12/2099
    Pour le decode et le sign, je te laisse tester simplement sous sqlplus
    SIGN(X) :
    Renvoie 1 si X>0
    Renvoie 0 si X = 0
    Renvoie -1 si X < 0

  18. #18
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    j'ai bien coder avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TO_DATE('31.12.99', 'DD.MM.YY')
    FROM dual
    31/12/2099
    car c'est sur la date 31/12/2099 que je souhaite faire des tests.

    Par contrepour le SIGN, quel est l'intéret pour ma requete que le test soit >0 ou <0 vue que je teste des dates ?

    merci de vos réponses.

  19. #19
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Essaye ceci :
    [CODE]SELECT nuhose,ngirse,datese,datsse,lbrmuf,daefuf,nbjose
    DECODE (SIGN(datsse - to_date(('&date1'),'DD/MM/RR), 1, to_date(('&date2'),'DD/MM/RR')-datese +1, -- Datsse > &date1
    DECODE(SIGN(datsse -to_date(( '&date2'),'DD/MM/RR'), -1, NULL, -- Datsse < &date2
    datsse-datese+1)) AS nbjour -- datsse <= &date1 et datsse >= &date2
    FROM SEJ,UFM
    WHERE nuufse=nufmuf
    AND ngirse IS NOT NULL
    AND datsse IN (to_date('01/1/07','DD/MM/RR'), to_date('31/12/99','DD/MM/RR') )
    AND daefuf IN (to_date('01/1/07','DD/MM/RR'), to_date('01/12/04','DD/MM/RR') )
    CODE]

    Quand tu saisis tes dates date1 et date2, il faut les saisir sous la forme DD/MM/YY.

    LBO72.

  20. #20
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Par défaut
    voici ce que la requete retourne comme résultats :

    Date1 = 01/01/07
    Date2 = 31/01/07

    DATESE DATSSE Nbjour calculé Nbjour que devrait donner la requete
    11/01/07 16/01/2007 21 5
    27/12/06 17/01/2007 36 17
    07/12/06 18/01/2007 56 18
    01/01/07 19/01/2007 31 19
    01/01/06 19/01/2007 396 19
    01/01/07 20/01/2007 31 20
    01/01/06 21/01/2007 31 21
    01/01/07 21/01/2007 396 21
    07/06/06 22/01/2007 239 22
    22/11/06 31/12/2099 72 31
    09/01/07 31/12/2099 23 31


    A chaque fois que la requête rencontre DATSSE=31/12/2099 alors NBJOUR=date2-date1
    Et lorsque DATSSE est comprise entre date1 et date2 alors NBJOUR=DATSSE-date1

    Je n'ai pas trouvé la solution avec DECODE et SIGN...

Discussions similaires

  1. [MySQL] requete avec date du jour - 30
    Par le69 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 31/01/2013, 16h38
  2. [Access] requête avec date
    Par hiko-seijuro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/08/2006, 10h05
  3. [debutant]Probleme de requete avec date
    Par shub dans le forum Access
    Réponses: 9
    Dernier message: 12/05/2006, 11h01
  4. requete avec date et heure
    Par robert_trudel dans le forum Access
    Réponses: 2
    Dernier message: 26/04/2006, 01h15
  5. [MySQL] requete avec date
    Par le69 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/12/2005, 22h31

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