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 :

Group by date sans les heures: minutes: secondes


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Points : 60
    Points
    60
    Par défaut Group by date sans les heures: minutes: secondes
    salut,

    j'essaie de faire une requête en utilisant group by date mais je remarque que le resultat est erroné du moment que plusieurs date identiques à la base sont considérés différentes lors de l'affichage:
    un exmple les dates suivantes sont présentes dans la table:

    01/10/2007 12:54:58
    01/10/2007 17:32:25
    01/10/2007 15:25:00
    05/10/2007 14:19:25
    05/10/2007 10:25:54

    quand j'exécute la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    select TO_DATE(CREATION_DATE,'dd-mm-rrrr') , count(ID) from table1 where  to_date( CREATION_DATE, 'dd-MON-rrrr') between '01-SEP-2007'and '15-OCT-2007'group by CREATION_DATE
    dans le résultat au lieu de s'attendre a une seule date '01/10/2007' je vois apparaitre 3 dates comme si elle sont différentes alors qu'elle sont censées être considéré comme étant la même! je m'attendais donc a un truc du genre
    01/10/2007 24 ( par exemple)
    05/10/2007 19 ...

    et non pas ceci:

    01/10/2007 10
    01/10/2007 10
    01/10/2007 4
    05/10/2007 13
    05/10/2007 6
    etc...

    je en sais pas comment me débarasser de l'heure afin que ma date puisse se limiter a seul la date du jour et encore être groupée avec les mêmes dates!



    merci

  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
    Points : 3 609
    Points
    3 609
    Par défaut
    Il faut utiliser trunc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT trunc(CREATION_DATE) , count(ID) FROM table1 WHERE  to_date( CREATION_DATE, 'dd-MON-rrrr') BETWEEN '01-SEP-2007'AND '15-OCT-2007'GROUP BY trunc(CREATION_DATE);
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Points : 60
    Points
    60
    Par défaut
    merci ca marche super !

    la j'ai un autre soucis avec mon curseur! en effet je n'ai qu'un seul ligne selon mon ROWCOUNT et quand j'essaie d'afficher ca s'affiche deux fois !

    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
     
    TYPE malignestat is RECORD
    (
    madate DATE,
    occurence INTEGER
    );
     
    monresultat malignestat ;
     
    CURSOR myresult is select TRUNC( CREATION_DATE)  from table1 where to_date(CREATION_DATE, 'dd-MON-rrrr') between '01-sep-2005'and '29-fev-2008' 'group by TRUNC(CREATION_DATE) ;
     
    BEGIN
     
    DBMS_OUTPUT.ENABLE(1000000);
     
    OPEN myresult;
     
    LOOP
    FETCH myresult INTO monresultat;
     DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
    DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
     
    exit WHEN myresult%NOTFOUND;
     
    END LOOP;
     
    END IF;
    CLOSE myresult;
    voila je en comprends po ou est l'anomalie
    merci

  4. #4
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Logique :
    1è tour :
    - un enregistrement est trouvé
    - affiche tes deux lignes
    - ne sort pas puisqu'un enregistrement a été trouvé
    2è tour :
    - aucun enregistrement trouvé
    - affiche tes deux lignes
    - sort puisqu'aucun enregistrement trouvé

    NB : Si tu veux que tes lignes ne s'affichent qu'une fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LOOP
       FETCH myresult INTO monresultat;
    exit WHEN myresult%NOTFOUND;
       DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
       DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    END LOOP;
    ou mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR monresultat in myresult LOOP
       DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
       DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    END LOOP;
    Petite remarque : à l'intérieur d'une boucle, le rowcount ne t'indique pas le nombre d'enregistrement total, mais le nombre d'enregistrements déjà "fetchés".
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Invité
    Invité(e)
    Par défaut
    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
    TYPE malignestat is RECORD
    (
    madate DATE,
    occurence INTEGER
    );
    
    monresultat malignestat ;
    
    CURSOR myresult is select TRUNC( CREATION_DATE)  from table1 where to_date(CREATION_DATE, 'dd-MON-rrrr') between '01-sep-2005'and '29-fev-2008' 'group by TRUNC(CREATION_DATE) ;
    
    BEGIN
    
    DBMS_OUTPUT.ENABLE(1000000);
    
    OPEN myresult;
    
    LOOP
    FETCH myresult INTO monresultat;
    exit WHEN myresult%NOTFOUND;
     DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
    DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    
    END LOOP;
    
    END IF;
    CLOSE myresult;
    C'est ton exit de la boucle qui est mal placé...
    Au 2éme tour, tu fais le dbms_output puis tu sors de ta boucle... Alors que tu veux sortir tout de suite si tu n'as plus rien !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    EXIT doit êtrre directement après le FETCH ...
    Consultant et formateur Oracle

  7. #7
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Logique :
    1è tour :
    - un enregistrement est trouvé
    - affiche tes deux lignes
    - ne sort pas puisqu'un enregistrement a été trouvé
    2è tour :
    - aucun enregistrement trouvé
    - affiche tes deux lignes
    - sort puisqu'aucun enregistrement trouvé

    NB : Si tu veux que tes lignes ne s'affichent qu'une fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LOOP
    exit WHEN myresult%NOTFOUND;
       FETCH myresult INTO monresultat;
       DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
       DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    END LOOP;
    ou mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR monresultat in myresult LOOP
       DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
       DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    END LOOP;
    Petite remarque : à l'intérieur d'une boucle, le rowcount ne t'indique pas le nombre d'enregistrement total, mais le nombre d'enregistrements déjà "fetchés".
    merci!
    ta deuxieme solution resoud le probleme en effet! cependant la premiere genere une erreur : du coup la variable madate n'est plus reconnue : ( !

  8. #8
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    IL y a avait une erreur de copier coller, j'ai corrigé.
    Comme l'avait dit Michel, le EXIT doit être directement après le FETCH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LOOP
       FETCH myresult INTO monresultat;
    exit WHEN myresult%NOTFOUND;
       DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
       DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    END LOOP;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par plaineR Voir le message
    IL y a avait une erreur de copier coller, j'ai corrigé.
    Comme l'avait dit Michel, le EXIT doit être directement après le FETCH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LOOP
       FETCH myresult INTO monresultat;
    exit WHEN myresult%NOTFOUND;
       DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
       DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
    END LOOP;
    oui tout a fait ! mais qu'en est il de la deuxieme solution? du coup la variable madate n'est plus reconnue !

  10. #10
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par KING_OF_GRACELAND Voir le message
    oui tout a fait ! mais qu'en est il de la deuxieme solution? du coup la variable madate n'est plus reconnue !
    Tu parles de quelle solution, celle avec le for ? Je croyais qu'elle fonctionnait ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  11. #11
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Tu parles de quelle solution, celle avec le for ? Je croyais qu'elle fonctionnait ?
    oui de cella la ! elle marche pas !

  12. #12
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Quelle est l'erreur ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  13. #13
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 100
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Quelle est l'erreur ?
    je l'avais signalée la varuiable madate n'est plus reconnue

  14. #14
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    2 solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
      CURSOR myresult IS SELECT TRUNC(CREATION_DATE) madate
                                FROM table1
                                WHERE to_date(CREATION_DATE, 'dd-MON-rrrr') BETWEEN '01-sep-2005' AND '29-fev-2008' 
                                group by TRUNC(CREATION_DATE) ;
    BEGIN
      DBMS_OUTPUT.ENABLE(1000000);
     
      FOR monresultat in myresult loop
          DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
          DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
      END LOOP;
    END;
    ou
    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
    DECLARE
      TYPE malignestat is RECORD
       (
        madate DATE,
        occurence INTEGER
       );
     
       monresultat malignestat ;
     
      CURSOR myresult return malignestat IS SELECT TRUNC(CREATION_DATE) madate
                                FROM table1
                                WHERE to_date(CREATION_DATE, 'dd-MON-rrrr') BETWEEN '01-sep-2005' AND '29-fev-2008' 
                                group by TRUNC(CREATION_DATE) ;
    BEGIN
      DBMS_OUTPUT.ENABLE(1000000);
     
      FOR monresultat in myresult loop
          DBMS_OUTPUT. Put_Line(myresult%ROWCOUNT);/* ca affiche bien 1 */
          DBMS_OUTPUT. Put_Line('la date du = ' || to_char (monresultat.madate) );  /* ca s'affiche deux fois !!!*/
      END LOOP;
    END;
    La première solution plus simple est à priviligier sauf si tu veux forcer le curseur à avoir un type précis.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

Discussions similaires

  1. [Flex3] Comparaison de dates ignorant les heures, minutes etc
    Par karami dans le forum Flex
    Réponses: 1
    Dernier message: 03/06/2011, 10h06
  2. La date sans les heures
    Par Avatar69 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 15/02/2010, 09h37
  3. Réponses: 3
    Dernier message: 24/09/2008, 16h23
  4. Afficher la date sans les heures
    Par danduril dans le forum BIRT
    Réponses: 2
    Dernier message: 08/07/2008, 16h00
  5. [HIBERNATE] date sans heure minute seconde
    Par _juel_ dans le forum Hibernate
    Réponses: 1
    Dernier message: 30/06/2006, 14h43

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