sql >> Database teknologi >  >> RDS >> Oracle

SQL-datokonverteringsresultater til ugyldig talformatmodelparameter.

Root-årsag:

Du konverterer et NUMBER til STRING , forudsat at det er DATE . 20111010 er ikke en DATO, det er et NUMMER. Også '20111010' er ikke en DATO, det er en STRING. De er helt forskellige.

  • 20111010 - NUMBER
  • '20111010' - STRING
  • TO_DATE('20111010','YYYYMMDD') - DATO

Fejl:

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

Kommer til din forespørgsel:

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

Du komplicerer konverteringen og formateringen unødigt.

TIMESTAMP datatype er en udvidelse på DATE datatype. Ud over datetime-elementerne i DATE-datatypen holder TIMESTAMP-datatypen brøkdele af et sekund med en præcision mellem 0 og 9 decimaler, standarden er 6.

Da du har med TIMESTAMP at gøre du kan bruge TO_TIMESTAMP .

Mens du laver en DATE/TIMESTAMP aritmetik , bør du lade datatypen være som den er og ikke konvertere den til streng . Du skal brugeTO_CHAR kun til visning .

Rediger dit filterprædikat som:

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

Ovenfor, :fromDate og :toDate skal være en streng og ikke et nummer .

For eksempel,

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

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

Eller brug TO_CHAR for først at konvertere nummeret ind i streng :

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

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


  1. Hvorfor kaster WHERE column =NULL ikke en fejl i SQL Server?

  2. Oracle-fejl ved opstart, endnu en opstarts-/nedlukningsoperation af denne instans i gang

  3. MySQL-forespørgsel for at vælge resultater med automatisk stigning som en ny kolonne tilføjet i resultatet

  4. MySQL versus SQL Server Express