Bonjour,

J'ai la requête suivante qui génère une erreur
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
NUDOSS, SOCDOS, PGPDOS, 1 NULIGN, TO_DATE(substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31', 'YYYY-MM-DD'), CODE5C, IDCONT, VALE31, FINP31 ,
TO_CHAR
(
   (TO_DATE(substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31', 'YYYY-MM-DD')),
   'DY'
)
JRCPTR
from ZY5C
where substr(anmois,5,2) in ('01', '03', '05', '07', '08', '10', '12')
and TO_DATE
(
   (substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31'), 'YYYY-MM-DD'
)
>= (SYSDATE - 90)
and TO_DATE
(
   (substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31'), 'YYYY-MM-DD'
)
<= (SYSDATE + 90)
/
L'erreur générée est ORA-01839: date not valid for month specified.
Le champ anmois de zy5c contient une chaine de type 201001, 201002 etc ..

En revanche la requête suivante passe sans problème :
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
NUDOSS, SOCDOS, PGPDOS, 1 NULIGN, TO_DATE(substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31', 'YYYY-MM-DD'), CODE5C, IDCONT, VALE31, FINP31 ,
TO_CHAR
(
   (TO_DATE(substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31', 'YYYY-MM-DD')),
   'DY'
)
JRCPTR
from ZY5C
where substr(anmois,5,2) in ('01', '03', '05', '07', '08', '10')
and TO_DATE
(
   (substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31'), 'YYYY-MM-DD'
)
>= (SYSDATE - 90)
and TO_DATE
(
   (substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31'), 'YYYY-MM-DD'
)
<= (SYSDATE + 90)
/
Il semblerait qu'oracle utilise les filtres dans un ordre qu'il juge plus efficient ce qui fait qu'il évalue le filtre ci-dessous en premier (ce qui gènère une erreur lorsqu'il tombe sur un enregistrement du type 201002 pour anmois (si oracle utilisait les filtres dans l'ordre indiqué dans la requête il n'y aurait pas de problème).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
TO_DATE
(
   (substr(anmois,1,4) || '-' || substr(anmois,5,2) || '-' || '31'), 'YYYY-MM-DD'
)
>= (SYSDATE - 90)
Il y a t-il moyen de forcer l'ordre d'utilisation des filtres ?

merci pour votre aide