Вот что происходит, когда даты хранятся в виде строк. Хотя большинство «дат» имеют правильный формат, который вы предсказали: YYYY-MM-DD
, не все из них имеют.
Например, если кто-то ввел сегодняшнюю дату как 08042020
и вы применили упомянутую маску формата, вы получите
SQL> select to_date('08042020', 'yyyy-mm-dd') from dual;
select to_date('08042020', 'yyyy-mm-dd') from dual
*
ERROR at line 1:
ORA-01861: literal does not match format string
SQL>
Что делать? Ожидайте (много?) Боли, чтобы исправить данные. Надеюсь, он научит вас (и других участников) хранить даты в DATE
столбцах.
Например, вы можете «перехватывать» недопустимые форматы, используя регулярные выражения (ожидая 4 цифры - 2 цифры - 2 цифры), но это не поможет со значениями, такими как 2020-34-87
, потому что это соответствует формату, но это чепуха.
Или, вы можете l oop через эти значения (то есть строка -by-row означает «медленно-медленно» и сбрасывает значения, для которых TO_DATE
не удается.
Вы можете попробовать маски разных форматов, например, YYYYMMDD
, но - с 20200408
, что такое 04
, а что 08
? И то, и другое может быть днями или месяцами.
Как я уже сказал, легкого выхода из этого не существует.