sql >> Databáze >  >> RDS >> Oracle

Nelze pochopit, jak se hodnota implicitně převádí do formátu data

Pravidla převodu řetězce na datum povolit další pravidla formátování (bez použití jakýchkoli dalších modifikátorů). Takže:

  • MM odpovídá také MON a MONTH;
  • MON odpovídá MONTH (a naopak);
  • RR odpovídá RRRR; a
  • Interpunkce je volitelná.

Takže:

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;

Všechny generují datum 2016-08-10T00:00:00 .

Tomu můžete zabránit pomocí FX model formátu

Potom:

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

Dává:ORA-01858: a non-numeric character was found where a numeric was expected a odpovídal by pouze tam, kde je nalezena přesná shoda vzoru (ačkoli RR bude stále odpovídat RRRR ).

Ano, Oracle implicitně používá TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) provést konverzi.

Pokud používáte:

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

Potom se vaše vložení nezdaří.




  1. Špinavá tajemství výrazu CASE

  2. Naformátujte hodnotu s dvojnásobnou přesností v Postgresql

  3. Jak odstranit řádek mysql po uplynutí času?

  4. Spojte dva řádky, které mají stejnou hodnotu ve dvou sloupcích