Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Resultados da conversão de data SQL para parâmetro de modelo de formato de número inválido.


Causa raiz:

Você está convertendo um NUMBER para STRING , supondo que seja DATE . 20111010 não é uma DATA, é um NÚMERO. Além disso, '20111010' não é uma DATE, é uma STRING. Eles são completamente diferentes.
  • 20111010 - NÚMERO
  • '20111010' - STRING
  • TO_DATE('20111010','YYYYMMDD') - DATA

Erro:
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

Chegando à sua 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')

Você está complicando desnecessariamente a conversão e a formatação.

O TIMESTAMP tipo de dados é uma extensão em DATE tipo de dados. Além dos elementos datetime do tipo de dados DATE, o tipo de dados TIMESTAMP contém frações de segundo com precisão entre 0 e 9 casas decimais, sendo o padrão 6.

Como você está lidando com TIMESTAMP você pode usar TO_TIMESTAMP .

Ao fazer uma aritmética DATE/TIMESTAMP , você deve deixar o tipo de dados como está e não convertê-lo em string . Você precisa usarTO_CHAR apenas para exibir .

Modifique seu predicado de filtro como:
WHERE CREATE_TIME 
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD') 
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')

Acima, :fromDate e :toDate deve ser uma string e não um número .

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

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

Ou use TO_CHAR para primeiro converter o número em cadeia :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;

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