Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2011, 14h33   #1
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
Par défaut TO_DATE fonctionne dans un SELECT mais provoque une erreur ORA-01861 (littéral non concordant) dans un WHERE !

Bonjour,

Je rencontre un souci avec les dates dans Oracle (je sais, c'est pas original).
J'ai la requête suivante :
Code :
1
2
3
4
5
6
7
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM      workcase w
         INNER JOIN
            case_variable CV
         ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
 WHERE   w.id = 306634
Qui me renvoie le résultat suivant :
Code :
1
2
VALUE = 2011/03/16  00:00:00
DATE_DEMANDE = 16/03/2011
Manifestement, la requête fonctionne donc (la colonne value est de type varchar2(2000) pour info).
Par contre, si je rajoute une clause where comme suit :
Code :
1
2
3
4
5
6
7
8
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM      workcase w
         INNER JOIN
            case_variable CV
         ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
 WHERE   w.id = 306634
         AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
J'obtiens une erreur ORA-01861 !
Comment se fait-il qu'une telle erreur se produise dans le where, alors même que dans le select la conversion to_date fonctionne ?! Je veux dire, à partir du moment où la conversion du varchar2 en date fonctionne, pourquoi sa comparaison avec sysdate échoue ?
Merci d'avance.
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h43   #2
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par lasyan3 Voir le message
Manifestement, la requête fonctionne donc (la colonne value est de type varchar2(2000) pour info).
to_date formate une chaine en date (d'où son nom) et non l'inverse !
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h58   #3
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Citation:
Envoyé par lasyan3 Voir le message
to_date formate une chaine en date (d'où son nom) et non l'inverse !
Effectivement, j'ai écris une très belle c*nn*ri*...
Je vais reprendre un café et fermé ma bouche....
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 09h40   #4
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
Malheureusement, cela ne change rien...

D'ailleurs, je précise que si je retire toute la clause WHERE, la requête fonctionne, le to_date renvoie null si la valeur de cv.value est null aussi.

Je précise aussi que je dispose de 3 bases : une de test, une de prod et une perso.
Sur la test, j'ai l'erreur ORA-1861.
Sur la prod, c'est une erreur ORA-1860 (input value not long enough for date format).
Sur ma base perso, par contre, je n'ai aucune erreur !

J'ai comparé le contenu de la table nls_session_parameters sur les 3 bases, elles sont identiques.

De plus, voici les versions des bases :
Base de test : Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
Base de prod : Oracle9i Release 9.2.0.7.0 - 64bit Production
Base perso : Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

Est-ce que cela pourrait être lié au fait que les bases de test et de prod sont en 64bit ?
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h38   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Est-ce qu’il y a un index sur CV.VALUE ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h54   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
quel est le résultat de
Code :
1
2
3
4
5
6
7
 
SELECT   CV.VALUE
  FROM      workcase w
         INNER JOIN
            case_variable CV
         ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
 WHERE   w.id = 306634
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h58   #7
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
laurentschneider > la requête renvoie le résultat suivant :
mnitu > non, par contre il y a un index sur la colonne variable.

Merci.
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h09   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Votre requête corresponde en fait à la requête suivante:
Code :
1
2
3
4
5
6
7
 
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM  case_variable CV
 WHERE   CV.tcid = 306634
   AND CV.variable = 'ddi_sap_date_demande'
   AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
Il doit y avoir une valeur non-date dans la colonne CV.VALUE parmi les enregistrements qui ont CV.variable = 'ddi_sap_date_demande'

[Edit]
La requête suivante devrait se planter avec la même erreur
Code :
1
2
3
4
5
 
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM  case_variable CV
 WHERE  CV.variable = 'ddi_sap_date_demande'
[/EDIT]
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h19   #9
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par mnitu Voir le message
La requête suivante devrait se planter avec la même erreur
Code :
1
2
3
4
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM  case_variable CV
 WHERE  CV.variable = 'ddi_sap_date_demande'
[/EDIT]
Justement, non, elle fonctionne ! C'est ce que je disais au début, le select fonctionne sans problème, mais le where plante ! C'est ça qui est énorme !

Citation:
Envoyé par mnitu Voir le message
Il doit y avoir une valeur non-date dans la colonne CV.VALUE parmi les enregistrements qui ont CV.variable = 'ddi_sap_date_demande'
A part des valeurs à null, toutes les valeurs sont du bon format, j'ai vérifié.

Citation:
Envoyé par mnitu Voir le message
Votre requête corresponde en fait à la requête suivante:
Code :
1
2
3
4
5
6
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM  case_variable CV
 WHERE   CV.tcid = 306634
   AND CV.variable = 'ddi_sap_date_demande'
   AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
Alors là c'est fort : cette requête fonctionne ! Ce serait lié à la jointure ?! WTF !!!
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h33   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Et cette requête ça fonctionne ?
Code :
1
2
3
4
5
 
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM  case_variable CV
 WHERE  CV.tcid = 306634
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 12h49   #11
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
Non, mais c'est normal car la table CASE_VARIABLE contient des valeurs de variables, donc elle possède au moins 2 colonnes : "variable" qui contient le nom de la variable, et "value" qui contient sa valeur.
Dans mes requetes, je me limite à la variable "ddi_sap_date_demande" car c'est elle que je veux récupérer dans la table.
Sans cette condition, je vais récupérer toutes les variables de la table, dont celles qui ne sont pas des dates (d'où l'erreur).
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h07   #12
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
bien sûr donc, rajoute sap au case


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT   CV.VALUE,
         CASE WHEN w.id = 306634 AND CV.variable = 'ddi_sap_date_demande'
THEN
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') 
         END AS date_demande
  FROM      workcase w
         INNER JOIN
            case_variable CV
         ON CV.tcid = w.id AND CV.variable = 'ddi_sap_date_demande'
 WHERE   w.id = 306634
         AND CASE WHEN w.id = 306634 AND CV.variable = 'ddi_sap_date_demande'
THEN
             TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') 
         END = SYSDATE
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h11   #13
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Dans le cas où l’optimiseur accède aux donnés via la colonne tcid et ensuite filtre avec to_date il y a plantage.
Dans le cas ou il prend le chemin qui accède ou filtre d’abord via la condition CV.variable = 'ddi_sap_date_demande' il n’y a plus d’anomalie.
Reprenez la proposition fait par laurent mais au lieu de tester w.id = 306634 dans le CASE testez variable = 'ddi_sap_date_demande'
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h19   #14
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
La dernière requête de laurent fonctionne.

A noter aussi que si je déplace la condition "AND CV.variable = 'ddi_sap_date_demande'" du inner join dans le where (sans utiliser de case), ça fonctionne aussi.

Il y a des chose qui m'échappent dans cette histoire, mais au moins je ne suis plus bloqué. Merci à tous !
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h22   #15
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par lasyan3 Voir le message
...Il y a des chose qui m'échappent dans cette histoire, mais au moins je ne suis plus bloqué. Merci à tous !
Pourtant je viens de vous l'expliquer.
Dans la requête proposé par laurent le case sur w.id CASE WHEN w.id = 306634 ne sert à rien en fait.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h34   #16
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
Oui, l'important était de filtrer sur le nom de la variable, afin d'être certain de ne récupérer que les valeurs pouvant être converties en date.

Je ne pensais simplement pas qu'il était nécessaire de refiltrer à nouveau dans le WHERE, vu qu'il y a déjà un filtre sur la jointure, et que le SELECT fonctionne sans CASE.
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h49   #17
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Oracle transforme votre requête comme bon il lui semble.
Dans ce cas écrivez votre requête ainsi
Code :
1
2
3
4
5
6
7
8
9
 
SELECT   CV.VALUE,
         TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') AS date_demande
  FROM      workcase w
         INNER JOIN
         (SELECT * FROM  case_variable WHERE variable = 'ddi_sap_date_demande') CV
         ON CV.tcid = w.id 
 WHERE   w.id = 306634
         AND TO_DATE (CV.VALUE, 'YYYY/MM/DD  HH24:MI:SS') = SYSDATE
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h59   #18
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
Mouais, la façon dont Oracle interprète les conditions "WHERE" et les jointures "ON" n'est vraiment pas glorieuse.

Avec le CASE, on est toujours plus tranquille, avec une clause where, ou sous-requête, un hint ou autre, ça peut toujours planter au prochain patch... Optimizer Tuning oblige
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/03/2011, 14h02   #19
Invité de passage
 
Inscription : avril 2003
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 21
Points : 3
Points : 3
C'est exactement la requête à laquelle je pensais, faire un inner join sur un select déjà filtré, mais vous voulez rire ? Ca ne marche pas ! J'ai une erreur ORA-01861.
Par contre, en ajoutant un CASE ou la condition sur "ddi_sap_date_demande" dans le WHERE avant le TO_DATE, ça refonctionne bien sur.
lasyan3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 14h30   #20
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Oui je me suis dit après que
Citation:
Oracle transforme votre requête comme bon il lui semble.
peut être aussi valable pour ma proposition.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h04.


 
 
 
 
Partenaires

Hébergement Web