Cause première :
Vous convertissez un NOMBRE à STRING , en supposant qu'il s'agisse de DATE . 20111010
n'est pas une DATE, c'est un NOMBRE. Aussi, '20111010'
n'est pas une DATE, c'est une CHAÎNE. Ils sont complètement différents.
20111010
- NOMBRE'20111010'
- CHAÎNETO_DATE('20111010','YYYYMMDD')
- DATE
Erreur :
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
Pour en venir à votre requête :
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
Vous compliquez inutilement la conversion et le formatage.
L'horodatage le type de données est une extension sur le DATE Type de données. En plus des éléments datetime du type de données DATE, le type de données TIMESTAMP contient des fractions de seconde avec une précision comprise entre 0 et 9 décimales, la valeur par défaut étant 6.
Puisque vous avez affaire à TIMESTAMP vous pouvez utiliser TO_TIMESTAMP .
Lors d'une arithmétique DATE/TIMESTAMP , vous devez laisser le type de données tel quel et ne pas le convertir en chaîne . Vous devez utiliser TO_CHAR uniquement pour affichage .
Modifiez votre prédicat de filtre comme :
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Ci-dessus, :fromDate
et :toDate
doit être une chaîne et non un numéro .
Par exemple,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Ou utilisez TO_CHAR pour le premier convertir le numéro en chaîne :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM