Oracle
 sql >> Base de données >  >> RDS >> Oracle

Résultats de la conversion de date SQL en paramètre de modèle de format de nombre non valide.

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ÎNE
  • TO_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