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 et erreur de type sur la console sql*plus


Sujet :

SQL Oracle

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut Date et erreur de type sur la console sql*plus
    Bonsoir ,

    J'execute la requête suivante qui me retourne un " inconsistent datatypes: expected DATE got NUMBER " sous la console SQL*PLUS ORACLE 9.

    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
    alter session set nls_territory='FRANCE';
    alter session set nls_date_language='FRENCH';
    ALTER SESSION SET NLS_DATE_FORMAT='DDMMYYYY' ;
     
    Undefine date_deb
    Undefine date_fin 
     
    accept date_deb prompt 'Saisir la date de début de période (jjmmaaaa) : '
     
    accept date_fin prompt 'Saisir la date de fin de période (jjmmaaaa) : ' 
     
    select code1, libcode1 , code2 , refcode2 , libcode2, round(sum(duree)/60,2) as duree_minute_vers_heure,  TO_DATE(madate,'WW') as semaine
    from tab1
    left join tab2 on tab1.code1=tab2.code1     
    left join tab3 on tab1.code2=tab3.code2
    where acvdtd_aag between &date_deb and &date_fin
    and libcode1 LIKE 'toto%'
    group by code1, libcode1 , code2 , refcode2ref , libcode2,TO_DATE(madate,'WW');

    En base les dates ont ce format : AAAAMMJJ. Je souhaite à la place le numéro de semaine.

    Merci de m'aiguiller.

    Je ne vois pas pourquoi il me dit que le type date est sachant que c'est déjà une date ...

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 081
    Points : 30 823
    Points
    30 823
    Par défaut
    Habituellement, SQL*Plus précise la ligne sur laquelle l'erreur est rencontrée... ce qui peut orienter vers sa résolution.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonsoir

    1) Le problème vient de cette fonction :
    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_DATE(madate,'WW')
    .

    2) L'erreur " inconsistent datatypes: expected DATE got NUMBER " vient de la ligne 6 du script . Ici je ne vois pas pourquoi il y a un erreur dans le script. J'ai fait un copié collé d'un autre script qui fait appelle exactement à la même fonction (saisi de date pour l'inteval) et dans l'autre requête il n'y aucun plantage.

    Ici Oracle me retourne une erreur alors qu'il n'y a pas lieu d'y en avoir . De plus à l'écran je vois très bien que le requête accepte ce qui est saisie.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 081
    Points : 30 823
    Points
    30 823
    Par défaut
    Quelle fonction ?

    Peut-on avoir l'intégralité des messages retournés par SQL*Plus ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Voici ce qui est retourné :

    Code ORACLE : 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
     
    SQL> accept date_deb prompt 'Saisir la date de début de période (jjmmaaaa) : ' 
    Saisir la date de début de période (jjmmaaaa) : 20150101
    SQL> accept date_fin prompt 'Saisir la date de fin de période (jjmmaaaa) : ' 
    Saisir la date de fin de période (jjmmaaaa) : 20150201
    SQL > select code1, libcode1 , code2 , refcode2 , libcode2, round(sum(duree)/60,2) as duree_minute_vers_heure,  TO_DATE(madate,'WW') as semaine
    from tab1
    left join tab2 on tab1.code1=tab2.code1     
    left join tab3 on tab1.code2=tab3.code2
    where acvdtd_aag between &date_deb and &date_fin
    and libcode1 LIKE 'toto%'
    group by code1, libcode1 , code2 , refcode2ref , libcode2,TO_DATE(madate,'WW');
     
    select code1, libcode1 , code2 , refcode2 , libcode2, round(sum(duree)/60,2) as duree_minute_vers_heure,  TO_DATE(madate,'WW') as semaine
    from tab1
    left join tab2 on tab1.code1=tab2.code1     
    left join tab3 on tab1.code2=tab3.code2
    where acvdtd_aag between 20150101 and 20150201
    and libcode1 LIKE 'toto%'
    SQL> 
    erreur ligne 6 : ERROR ORA-00932: inconsistent datatypes: expected DATE got NUMBER
    SQL>
    group by code1, libcode1 , code2 , refcode2ref , libcode2,TO_DATE(madate,'WW');

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 081
    Points : 30 823
    Points
    30 823
    Par défaut
    L'information intéressante est ici :
    erreur ligne 6 : ERROR ORA-00932: inconsistent datatypes: expected DATE got NUMBER
    La ligne 6 de ta requête c'est : where acvdtd_aag between 20150101 and 20150201.
    Quel est le type de la colonne acvdtd_aag ?
    Sans doute une DATE au vu du message d'erreur qui explique qu'il faut la comparer avec des dates, pas des nombres.

    Yapuka :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where acvdtd_aag between TO_DATE('20150101', 'yyyymmdd') and TO_DATE('20150201', 'yyyymmdd')
    Ou en ramenant le nom des variables à la place des valeurs saisies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where acvdtd_aag between TO_DATE('&datedeb', 'yyyymmdd') and TO_DATE('&datefin', 'yyyymmdd')
    Toute la résolution de ton problème était dans la lecture du message d'erreur.
    Et quand Oracle te dit que l'erreur est à la ligne 6, c'est qu'il a de bonnes raisons de le penser.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonjour ,

    Citation Envoyé par al1_24
    Quel est le type de la colonne acvdtd_aag ?
    C'est bien une date effectivement .

    Citation Envoyé par al1_24
    ]Toute la résolution de ton problème était dans la lecture du message d'erreur.
    J'ai passé et repassé le code en boucle , il y avait aussi le problème du " YYYYMMDD " et " DDMMYYYY " , soit 2 formats différents .

    Citation Envoyé par al1_24
    Et quand Oracle te dit que l'erreur est à la ligne 6, c'est qu'il a de bonnes raisons de le penser.
    J'ai balayé et rebalayé le code. Si on ne corrigeai pas la première erreur avec les formats " YYYYMMDD " et " DDMMYYYY " , il n'était pas possible de voir la seconde

    Merci des tuyaux

  8. #8
    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
    Citation Envoyé par tanaka59 Voir le message
    J'ai passé et repassé le code en boucle , il y avait aussi le problème du " YYYYMMDD " et " DDMMYYYY " , soit 2 formats différents.
    Il y avait l'erreur dans le texte du prompt, mais rien de plus.
    Une date n'a pas de format, c'est une erreur qu'on voit très fréquemment sur le forum.

    L'affichage d'une date a un format, qu'on peut définir de plusieurs façons, les plus connues étant la fonction to_char et le paramètre nls_date_format.

  9. #9
    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
    Bonjour,

    Il n'y a personne que ça choque ? Moi ça me sort une erreur
    ORA-01820: format code cannot appear in date input format
    Un TO_DATE c'est pour transformer une chaine de caractère (pas un nombre) en DATE (toujours mettre un format afin d'éviter des erreurs)
    Un TO_CHAR c'est pour transformer une date en une chaine de caractère (avec un format d'affichage)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonjour

    A) >> McM :

    Citation Envoyé par McM Voir le message
    Bonjour,

    Il n'y a personne que ça choque ?
    Effectivement , c'est une erreur de ma part. Au lieu de dire ma date , plutôt dire la chaine au format AAAAMMJJ; on se comprendra mieux je pense .

    B) >> McM :

    Citation Envoyé par McM Voir le message
    Bonjour,

    Il n'y a personne que ça choque ?
    Par contre afin d'optimiser le code je préconise de remplacer WW par IW (c'est le numéro de semaine iso le IW ) . Faites un test sur la semaine 31 aout 2015 au 4 septembre 2015. Vous obtenez semaine 35 ET 36 avec le WW. Avec le IW vous obtenez un seul numéro de semaine unique (le 36).

    C) >> al1_24 : Pour te réponde , j'ai détecté un problème de variable dans la boucle suivante :

    Code ORACLE : 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
    -- saisi des variable
     
    accept datedeb prompt 'Saisir la date de début au format (AAAAMMJJ) : ' 
     
    accept datefin prompt 'Saisir la date de fin au format (AAAAMMJJ) : ' 
     
    -- requete 1
     
    select champ1 , champ2 , champdate
    from matableA
    where champdate between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd');
     
    -- requete 2
     
    select champ4 , champ5 , champdate
    from matableB
    where champdate2 between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd');
     
    -- requete 3
     
    select champ6 , champ7 , champdate
    from matableC
    where champdate between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd');

    Quand on lance le code suivant au démarrage on aura ceci :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisir la date de début au format (AAAAMMJJ) :
    Saisir la date de fin au format (AAAAMMJJ) :

    Jusque la tout vas bien , par contre à chaque rêquete on demande à l'utilisateur de resaisir une champs déjà saisie ??? J'ai envie de dire pourquoi la console redemande la chose ; Voici ce que s'affiche :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisir une valeur pour datedeb :
    Saisir une valeur pour datefin :

    D) >> al1_24 : un dernier bug que je viens de trouver. Lorsque je relance la suite de requete via la commande start + lien.sql , Oracle garde en mémoire ce qui a été saisi en premier lieu pour ceci :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisir la date de début au format (AAAAMMJJ) :
    Saisir la date de fin au format (AAAAMMJJ) :

    Le message d'erreur suivant s'affiche :

    Code ORACLE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ancien [numéro de ligne dans la requête] : where champdate between to_date('&datedeb','yyyymmdd') and to_date('&datefin','yyyymmdd')
    nouveau [numéro de ligne dans la requête] : where champdate between to_date('','yyyymmdd') and to_date('','yyyymmdd')
    where champdate between to_date(,'yyyymmdd') and to_date(,'yyyymmdd')
                                    *
    erreur à la ligne [numéro de ligne dans la requête]:
    ora-00936 : missing expression

    Pourtant la variable dispose déjà d'une valeur , pourquoi cela plante si on relance ?

    Merci pour les aiguillages

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonjour

    Voici une solution de date que l'utilisateur saisie est qui fonctionne :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select c1 , c2 , c3 , c4 , sum(c5)/60 ,  TO_char(c6,'IW')
    from t1
    left join t2 on t1.c1=t2.c1
    left join t3 on t1.c3=t3.c1
    where c6 between TO_DATE('&datedeb', 'yyyymmdd') and TO_DATE('&datefin', 'yyyymmdd')
    group by c1 , c2 , c3 , c4, TO_char(c6,'IW')
    order by c1 , c3 asc ;

    Ici on supposera c1 et c3 de t1 étant des codes (clef) , c5 une durée en minute , c6 une date au format AAAAMMJJ , c2 et c4 des libellés.

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

Discussions similaires

  1. Erreur de lieur sur projet console
    Par Mercusyo dans le forum C++Builder
    Réponses: 6
    Dernier message: 23/09/2012, 14h49
  2. [Turbo Pascal] [XP SP3] Erreur au lancement sur la console
    Par Joooseph dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 06/12/2009, 14h30
  3. Erreur de type sur un code
    Par Mr T 94 dans le forum IHM
    Réponses: 6
    Dernier message: 24/02/2009, 23h47
  4. erreur de connection sur une base sql à partir de vb6
    Par diatta dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/04/2007, 13h12
  5. Réponses: 8
    Dernier message: 20/02/2006, 15h28

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