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

Impossibile capire in che modo il valore è stato convertito in formato data in modo implicito

Le Regole di conversione da stringa a data consentire regole di formattazione aggiuntive (senza l'applicazione di altri modificatori). Quindi:

  • MM corrisponde anche a MON e MONTH;
  • MON corrisponde a MONTH (e viceversa);
  • RR corrisponde a RRRR; e
  • La punteggiatura è facoltativa.

Quindi:

SELECT TO_DATE( '10AUGUST2016', 'DD-MM-RR'    ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUGUST2016', 'DD-MON-RR'   ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUGUST2016', 'DD-MONTH-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016',    'DD-MM-RR'    ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016',    'DD-MON-RR'   ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016',    'DD-MONTH-RR' ) FROM DUAL;

Tutti generano la data 2016-08-10T00:00:00 .

Puoi impedirlo utilizzando FX modello di formato

Quindi:

SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR'    ) FROM DUAL;

Fornisce:ORA-01858: a non-numeric character was found where a numeric was expected e corrisponderebbe solo dove viene trovata una corrispondenza esatta del modello (sebbene RR corrisponderà ancora a RRRR ).

Sì, Oracle utilizza implicitamente TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) per eseguire la conversione.

Se usi:

ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';

Quindi il tuo inserimento fallirà.