sql >> Databasteknik >  >> RDS >> Oracle

Det går inte att förstå hur värde konverterats till datumformat implicit

String-to-Date-konverteringsreglerna tillåt ytterligare formateringsregler (utan att några andra modifierare tillämpas). Så:

  • MM matchar även MON och MONTH;
  • MON matchar MONTH (och vice versa);
  • RR matchar RRRR; och
  • Teckensättning är valfri.

Så:

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;

Alla genererar datumet 2016-08-10T00:00:00 .

Du kan förhindra detta genom att använda FX formatmodell

Sedan:

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

Ger:ORA-01858: a non-numeric character was found where a numeric was expected och skulle bara matcha där en exakt mönstermatchning hittas (även om RR kommer fortfarande att matcha RRRR ).

Ja, Oracle använder implicit TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) för att göra konverteringen.

Om du använder:

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

Då misslyckas din infogning.




  1. Hur man använder Oracle DB-sekvenser utan att förlora nästa sekvensnummer vid återställning

  2. JOIN Multiple Table baserat på tidsstämpel och ett annat villkor

  3. PostgreSQL CTE-poster som parametrar för att fungera

  4. kapslad infoga i mysql för taggning