sql >> Base de Datos >  >> RDS >> Oracle

La conversión de fecha SQL da como resultado un parámetro de modelo de formato de número no válido.

Causa raíz:

Estás convirtiendo un NUMBER a STRING , suponiendo que sea FECHA . 20111010 no es una FECHA, es un NUMERO. Además, '20111010' no es una FECHA, es una CADENA. Son completamente diferentes.

  • 20111010 - NÚMERO
  • '20111010' - CADENA
  • TO_DATE('20111010','YYYYMMDD') - FECHA

Error:

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

En cuanto a su consulta:

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')

Está complicando innecesariamente la conversión y el formateo.

La MARCA DE TIEMPO tipo de datos es una extensión en el FECHA tipo de datos. Además de los elementos de fecha y hora del tipo de datos DATE, el tipo de datos TIMESTAMP contiene fracciones de segundo con una precisión de entre 0 y 9 decimales, siendo 6 el valor predeterminado.

Dado que se trata de TIMESTAMP podrías usar TO_TIMESTAMP .

Mientras hace una aritmética de FECHA/TIMESTAMP , debe dejar el tipo de datos como está y no convertirlo en cadena . Necesitas usar TO_CHAR solo para pantalla .

Modifique su predicado de filtro como:

WHERE CREATE_TIME 
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD') 
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')

Arriba, :fromDate y :toDate debe ser una cadena y no un número .

Por ejemplo,

SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;

TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM

O utilice TO_CHAR primero convertir el número en cadena :

SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;

TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM