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

Oracle Discussion :

[OEM 2.2.0.0.0] ORA-00932: inconsistent datatypes


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut [OEM 2.2.0.0.0] ORA-00932: inconsistent datatypes
    bonjour.

    j'ai essayé à plusieurs reprises de faire marcher cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update presence set duree = ('11:28' - '11:01') where jour = '06-02-06' and id_stagiaire = '8389'
    (jour et duree sont de format date)

    Mais malheureusement cette requête ne veut pas passer si quelqu'un peut me dire à quel niveau ça cloche...


    Merci d'avance .

  2. #2
    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 va falloir comprendre le datatype DATE.

    Une DATE n'est pas une chaine de caractère. Il y a un seul cas particulier qui ne devrait pas être utilisé : le '01/01/2006' est considéré par oracle comme la date 01 janvier 2006 0 heure.

    Dans TOUS les autres cas, il faut faire une conversion de ta chaine de caractère pour la passer en date par un TO_DATE

    Donc A remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jour = TO_DATE('06-02-06', 'DD-MM-YY')
    Ensuite les fonctions sur les dates peuvent renvoyer des NUMBER.
    C'est la cas de la soustraction date1 - date2 qui te renvoie le nombre de jours (avec les décimales pour les heures... secondes) entre les 2 dates.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    duree = ('11:28' - '11:01')
    Ne marche donc pas pour 2 raisons si tu as bien compris :
    1/ '11:28' - '11:01' pour oracle c'est comme du 'aajhf125' - '4455558787', il ne sait pas que ce sont des dates.
    2/ duree est un format DATE, il faut donc lui passer une date (faut lui donner un jour....) et pas un nombre (dans le cas où tu ferais une différence de dates).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    Je savais déjà que le problème venait de là j'ai essayé tout à l'heure ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update presence set duree = (to_date('11:28', 'DD-MM-YY HH24:MI') - to_date('11:01', 'DD-MM-YY HH24:MI')) where jour = to_date('06-02-06','DD-MM-YY') and id_stagiaire = '8389'
    Mais ça a toujours donné le même résultat

  4. #4
    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 McM
    Il va falloir comprendre le datatype DATE.
    2/ duree est un format DATE, il faut donc lui passer une date (faut lui donner un jour....) et pas un nombre (dans le cas où tu ferais une différence de dates).

  5. #5
    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 shnouf
    Je savais déjà que le problème venait de là j'ai essayé tout à l'heure ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update presence set duree = (to_date('11:28', 'DD-MM-YY HH24:MI') - to_date('11:01', 'DD-MM-YY HH24:MI')) where jour = to_date('06-02-06','DD-MM-YY') and id_stagiaire = '8389'
    Mais ça a toujours donné le même résultat
    '11:01' Ressemble pas à 'DD-MM-YY HH24:MI' .. elle est où la chaine "DD-MM-YY" dans ton '11:01' ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update presence set duree = (to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI') - to_date('01-févr.-2006 11:01', 'dd-mon-YYYY HH24:MI')) where jour = to_date('06-02-06','dd-mon-YYYY') and id_stagiaire = '8389'
    Toujours le même soucis, je ne sais pas quoi faire de mieux

  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
    2/ duree est un format DATE, il faut donc lui passer une date (faut lui donner un jour....) et pas un nombre (dans le cas où tu ferais une différence de dates).
    (to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI') - to_date('01-févr.-2006 11:01', 'dd-mon-YYYY HH24:MI')) = 0.1875
    Ce n'est pas une DATE, c'est 0.1875 d'un jour.
    Pour avoir une date, il faut rajouter ce chiffre à une date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    trunc(sysdate) +
    (to_date(v_date1, 'DD.MM.YYYY HH24:MI:SS') - to_date(v_date2, 'DD.MM.YYYY HH24:MI:SS') )
    Encore une fois, essaye de bien comprendre et teste genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI') - to_date('01-févr.-2006 11:01', 'dd-mon-YYYY HH24:MI'))   from dual
    pour voir ce que ça te donne.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    Heu, je n'ai pas trop compris comment ma requête peut valoir 0.1875

    Sinon j'ai essayé ton trunc(sysdate)+...
    ça m'a affiché
    not a valid month
    Sinon je n'ai pas vraiment compris ce qu'est sensé faire ta 2e requête d'autant plus que je n'ai aucunne table dans ma bdd nommée "dual".
    Je l'ai toutefois testée mais ça m'a affiché comme quoi il était impossible d'extraire les données de la table.

  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
    Bon, petit cours :
    DUAL sous oracle est une table system qui ne contient qu'une seule ligne.
    SELECT sysdate FROM dual t'affichera 1 ligne avec la date actuelle.

    Pour tes problèmes, essaye de garder un format numérique de tes mois car suivant les systèmes ce sera février ou february. Donc mieux vaut mettre '01/02/2006', 'DD/MM/YYYY' et tu n'auras plus de problèmes de mois.

    Les dates comment ça marche.
    SYSDATE retourne la date courante

    LAST_DAY(v_date) renvoie la dernière date du mois de v_date.

    NEXT_DAY(v_date, nomjour) renvoie la date du "nomjour" après v_date.

    ADD_MONTHS(v_date, v_nbmois) Renvoie une date = v_date + v_nbmois (mois).

    MONTHS_BETWEEN(v_date1, v_date2) renvoie le nombre de mois entre les 2 dates (v_date1 - v_date2) (Avec décimales)

    TO_DATE permet de transformer une chaine de caractères en date.
    TO_CHAR permet de transformer une date en chaine de caractère

    TO_DATE( chaine [, format [, nls_lang ]]) renvoie une DATE
    TO_CHAR( date [, format [, nls_lang ]]) renvoie un VARCHAR2
    format :
    DD jour, DAY jour complet (Attention aux espaces), DDD N) du jour dans l'année, D N° du jour dans la semaine,
    MM mois, MONTH mois toutes lettres, MON mois 3 lettres
    YY Année 2 chiffres, YYYY Année 4 chiffres, RR année 2 chiffres (2000), RRRR Année 4 chiffres
    HH Heure sur 12h, HH24 sur 24h
    MI Minutes
    SS : Secondes
    SSSSS secondes deouis 0h00m00s
    WW N° de la semaine dans l'année, IW N° de la semaine ISO, W N° de la semaine dans le mois.
    nls_lang :
    'NLS_DATE_LANGUAGE = french'
    ou american, german.. pour avoir les noms en langue étrangère.
    Ca change aussi les n° de jour (ex 1er jour de la semaine = Dimanche pour les anglais)

    TRUNC(date [, format]), tronque la date au niveau du format.
    ROUND(date [, format]), arrondi la date au niveau du format.
    Par défaut le format est le jour.

    trunc(sysdate, 'MM') donnera le 1er du mois courant
    trunc(sysdate, 'YYYY') donnera le 1er de l'année courante
    trunc(sysdate, 'MI') donnera la date courante à la minute près.

    date2 - date1 donne la différence entre date1 et date2 en nombre de jours avec les décimales, à la seconde près => Renvoie un nombre.
    date1 : 05/02/2006 11h24
    date2 : 06/02/2006 11h26
    date2 - date1 = 1.001389
    Multiplier ce chiffre par 24 pour avoir le nb d'heure (24h/jours)
    Multiplier ensuite par 60 pour avoir le nb de minutes (60min/h)

    date1 + v_nbjour Ajoute à date1 le nb de jour (avec décimale) => Renvoie une date.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    ok mais ce que je n'ai pas compris dans ce que tu as dis c'est ça:
    (to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI') - to_date('01-févr.-2006 11:01', 'dd-mon-YYYY HH24:MI')) = 0.1875
    Ce n'est pas une DATE, c'est 0.1875 d'un jour.
    Je n'arrive toujours pas à comprendre ce qui ne va pas dans ma requête.

  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
    Citation Envoyé par shnouf
    ok mais ce que je n'ai pas compris dans ce que tu as dis c'est ça:
    (to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI') - to_date('01-févr.-2006 11:01', 'dd-mon-YYYY HH24:MI')) = 0.1875
    Ce n'est pas une DATE, c'est 0.1875 d'un jour.
    Je n'arrive toujours pas à comprendre ce qui ne va pas dans ma requête.
    Une différence entre 2 dates donne le nombre de jour entre ces 2 dates.
    Pourquoi veux-tu insérer ce nombre dans un champ de type DATE ?
    Une date dans Oracle c'est un jour, un mois, un an, une heure, une minute, une seconde.
    Ensuite le format 'mon' donne un mois sur 3 caractères. "févr" : 4 caract

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    bon histoire de tester un peu j'ai remis le champ duree en varchar et j'ai retesté cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update presence set duree = (to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI') - to_date('01-févr.-2006 11:01', 'dd-mon-YYYY HH24:MI')) where jour = to_date('06-02-06','dd-mon-YYYY') and id_stagiaire = '8389'
    ça m'a affiché
    not a valid month
    Ensuite le format 'mon' donne un mois sur 3 caractères. "févr" : 4 caract
    ben dans les requêtes qui m'ont fait insérer "'01-févr.-2006" et '06-02-06' j'avais utilisé le format mon.

    Celà dit, il y a une question que je me pose:
    peut être que oracle n'est pas capable de calculer une différence de mois à partir du moment où ils sont écrits en lettre...

    Je ne suis pas sur de ce que je viens de dire il faudrait me confirmer ça.

  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
    Excuses moi, mais faut être carré en programmation.

    Tu ne peux pas mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date('01-févr.-2006 11:28', 'dd-mon-YYYY HH24:MI')
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date('06-02-06','dd-mon-YYYY')
    dans la même requete pour faire des tests.
    Le format "mon" c'est le mois tronqué, pas le nombre. Dans tous les cas, si la première est juste, la seconde sera fausse et inversemment.

    D'où viennent ces valeurs que tu mets dans ta requete ?
    Essaye de garder tout le temps le même format pour tes données.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    oui c'est normal il s'agit de 2 champs différent sur un de ces 2 champs ça n'est pas très gênant d'avoir les mois en chiffre seulement là j'essaie de changer le format des mois des autres champs en chiffres sur une année.

    Le problème c'est que j'ai une requête dans mon code je ne sais pas vraiment comment elle fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into presence( id_stagiaire, ip_poste, heure_arrivee, jour) VALUES ('8389', '164.2.249.230', to_date(to_char (SYSDATE, 'dd-mm-YYYY') || '13:21','dd-mm-YYYY HH24:MI'),to_date(sysdate || to_char (sysdate, 'HH24:MI') ,'dd-mm-YYYY HH24:MI'))


    Cette requête est sensée insérer les valeurs dans les champs id_stagiaire, ip_poste, heure_arrivee et jour.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    bon finalement j'ai viré cette requête et j'ai mise celle là à la place:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into presence( id_stagiaire, ip_poste, heure_arrivee, jour) VALUES ('8389', '164.2.249.230', to_date(sysdate,'dd-mm-YYYY HH24:MI'), to_date(sysdate,'dd-mm-YYYY'))
    Non seulement elle marche mieux mais en plus elle est plus simple le seul soucis c'est que dans le champ "jour", il m'insère l'heure alors que je ne veut que le jour.
    Y aurait-il un moyen de ne pas lui faire insérer l'heure ou tout au moins de lui demander d'insérer tout le temps la même heure quelle que soit l'heure dans la journée?

    Merci

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    autre soucis: il m'insère dans le champ heure_arrivee 12h00 alors qu'il est 13h53

  17. #17
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    vérifie l'heure de ton serveur !

  18. #18
    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
    to_date(sysdate) ??!?!?
    M'enfin, TO_DATE() prend un varchar2 qu'il transforme en DATE.
    SYSDATE est la date système, tu peux pas transformer une date en une date.

    Tu veux insérer (dans un champ de type DATE) une date avec l'heure et tout et tout : SYSDATE
    Tu veux n'insérer (dans un champ de type DATE) que la date sans les heures.. TRUNC(SYSDATE) (l'heure sera = '00:00:00')

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 155
    Par défaut
    ok j'ai réussi à avoir l'heure exacte sur le champ 'heure_arrivee'

    Mais il me reste deux problèmes:

    Les mois continuent encore et toujours à s'insérer en lettre et c'était pour cette raison que je continuais à me servir du to_date.

    Quand j'utilise la fonction TRUNC, dès que je spécifie plus d'une valeur je reçois un message sur oracle comme quoi j'ai spécifié trop de valeurs.

  20. #20
    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
    Les mois ne s'insèrent pas en lettre, le format DATE est stocké en codé par oracle.
    C'est ton affichage qui tranforme la date en visible avec des mois en lettres.

    fais un select to_char(heure_arrivee, 'DD.MM.YYYY HH254:MI:SS') , et tu auras des chiffres.

    Ensuite le TRUNC tronque à la précision que tu demandes.
    Si tu veux une précision au mois (TRUNC(date, 'MM')) , tu ne spécifies pas l'année.
    Si tu veux une précision au jour (TRUNC(date, 'DD')), tu ne spécifies pas le mois et l'année.
    etc...

Discussions similaires

  1. ORA-00932: inconsistent datatypes: expected %s got %s
    Par labolabs dans le forum PL/SQL
    Réponses: 0
    Dernier message: 26/08/2009, 12h12
  2. Réponses: 4
    Dernier message: 19/09/2007, 16h18
  3. ORA-932 : inconsistent datatypes
    Par fulub dans le forum Oracle
    Réponses: 5
    Dernier message: 16/03/2007, 09h12
  4. ORA-00932 Replace sur un champ Long impossible ?
    Par Phénélas dans le forum Oracle
    Réponses: 5
    Dernier message: 16/01/2007, 11h53
  5. [10R2]ORA-00932: sur Datapump ou export
    Par Fabien Celaia dans le forum Oracle
    Réponses: 8
    Dernier message: 11/03/2006, 07h18

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