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 :

[Oracle 10g] pb de convertion de VarChar en Date


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 10
    Par défaut [Oracle 10g] pb de convertion de VarChar en Date
    Bonjour,

    J'ai un problème de conversion de données.

    J' exécute la requête suivante:

    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
    SELECT e.achvte||e.typeve||LPAD(e.numeve,9,0) as reference
    FROM EVE e, ZOD z
    WHERE e.codsoc = p_codsoc
    AND e.achvte = p_achvte
    AND e.typeve = p_typeve
    AND z.typzod = 'EVE'
    AND z.numzod = cte_zod_niveau_facture
    AND z.valzod != '0'
    AND z.codsoc = e.codsoc
    AND z.clezod = e.achvte||e.typeve||LPAD(e.numeve,9,0)
    AND NOT EXISTS (SELECT distinct numech FROM EVM m, EVT t
    			WHERE m.codsoc = e.codsoc
    			AND m.achvte = e.achvte
    			AND m.typeve = e.typeve
    			AND m.numeve = e.numeve
    			AND t.codsoc = m.codsoc
    			AND t.achvte = m.achvte
    			AND t.typeve = m.typeve
    			AND t.numeve = m.numeve
    			AND t.numpos = 0
    			AND m.valzn5 = 'IMP'
    			AND m.valzn13 > t.codzn8 + delai)
    La dernière clause n'est pas correcte.

    m.valzn13 est de type VARCHAR2(40) et contient une date au format 'YYYYMMDD'
    t.codzn8 est de type VARCHAR2(12) et contient une date au format 'YYYYMMDD'
    delai est récupéré par une fonction qui retourne du VARCHAR2.

    Alors que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND m.valzn13 > to_char(sysdate + delai, 'YYYYMMDD')
    ça ne pose pas de problème.

    Avez vous une idée pour résoudre ce souci,

    Merci.

    BDD: Oracle 10g

    Balises ajoutées par Magnus, merci d'y penser

  2. #2
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Il existe des fonctions de transtypage pour gérer ces soucis, il faut les utiliser. Déjà, je suis étonné que tu puisse ajouter un délai en VARCHAR à une date, je ne savais pas qu'Oracle était aussi permissif ...

    Pour avoir une clause qui compare des dates, essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    AND TO_DATE(m.valzn13) > TO_DATE(t.codzn8) + TO_NUMBER(delai))
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Problème Oracle => forum Oracle.

    Merci de lire : Postez dans le forum approprié

    Je déplace.
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut
    Citation Envoyé par mjolymelot
    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
    SELECT e.achvte||e.typeve||LPAD(e.numeve,9,0) as reference
    FROM EVE e, ZOD z
    WHERE e.codsoc = p_codsoc
    AND e.achvte = p_achvte
    AND e.typeve = p_typeve
    AND z.typzod = 'EVE'
    AND z.numzod = cte_zod_niveau_facture
    AND z.valzod != '0'
    AND z.codsoc = e.codsoc
    AND z.clezod = e.achvte||e.typeve||LPAD(e.numeve,9,0)
    AND NOT EXISTS (SELECT distinct numech FROM EVM m, EVT t
    			WHERE m.codsoc = e.codsoc
    			AND m.achvte = e.achvte
    			AND m.typeve = e.typeve
    			AND m.numeve = e.numeve
    			AND t.codsoc = m.codsoc
    			AND t.achvte = m.achvte
    			AND t.typeve = m.typeve
    			AND t.numeve = m.numeve
    			AND t.numpos = 0
    			AND m.valzn5 = 'IMP'
    			AND m.valzn13 > t.codzn8 + delai)
    La dernière clause n'est pas correcte.

    m.valzn13 est de type VARCHAR2(40) et contient une date au format 'YYYYMMDD'
    t.codzn8 est de type VARCHAR2(12) et contient une date au format 'YYYYMMDD'
    delai est récupéré par une fonction qui retourne du VARCHAR2.

    Alors que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND m.valzn13 > to_char(sysdate + delai, 'YYYYMMDD')
    ça ne pose pas de problème.
    Erreur de conversion normal :

    quand tu fais :
    m.valzn13 > t.codzn8 + delai

    Oracle voit l'opérateur "+", il converti tout ce qui n'est pas numérique en numérique. Il ne va pas faire une comparaison de dates, il ne sait pas que ta chaine de caractères contient une date.

    Quand tu fais :
    m.valzn13 > to_char(sysdate + delai, 'YYYYMMDD')
    Lorsque tu compare une chaine et une date, Oracle va faire une transformation de la chaine de caractères en date. Il ne peut comparer que des choses de même type.

    Si tu avais : chaine = numérique, Oracle transforme la chaine en numérique.

    Il ne faut jamais laisser Oracle faire lui-même les conversions de types.

    Pour résoudre ton problème :
    to_date(m.valzn13, 'YYYYMMDD' > to_date(t.codzn8, 'YYYYMMDD') + to_number(delai)

Discussions similaires

  1. Installation ORACLE 10g sous XP Pro
    Par DUCORROY dans le forum Oracle
    Réponses: 7
    Dernier message: 21/10/2004, 09h08
  2. Installation Oracle 10g sous Windows 2000
    Par Jeff206 dans le forum Oracle
    Réponses: 6
    Dernier message: 24/08/2004, 15h51
  3. [ORACLE 10g Linux] Pbm de connexion avec un Client winXP
    Par zarbiwayne dans le forum Administration
    Réponses: 26
    Dernier message: 20/08/2004, 22h37
  4. Réponses: 2
    Dernier message: 23/06/2004, 16h06

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