Для недопустимых дат (год 20118) невозможно написать хорошее выражение для преобразования ... но для остальных подход может быть:
with dats as (
select '5/2/2018' dt from dual
union all select '5/21/2018' dt from dual
union all select '01/29/2018' dt from dual
union all select '2018-01-13' dt from dual
union all select '8/17/20118' dt from dual
union all select '23018' dt from dual
)
select dt
, to_char(
case when regexp_like(dt,'(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/([12][0-9]{3,3})$') then to_date(dt,'DD/MM/YYYY')
when regexp_like(dt,'((0?[1-9]|1[0-2])/0?[1-9]|[12][0-9]|3[01])/([12][0-9]{3,3})$') then to_date(dt,'MM/DD/YYYY')
when regexp_like(dt,'([12][0-9]{3,3})-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])$') then to_date(dt,'YYYY-MM-DD')
-- when regexp_like(dt,'^(0?[1-9]|1[0-2])(0?[1-9]|[12][0-9]|3[01])(([12][0-9])?[0-9]{2,2})$') then to_date(regexp_replace(dt,'^(0?[1-9]|1[0-2])(0?[1-9]|[12][0-9]|3[01])(([12][0-9])?[0-9]{2,2})$','\1/\2/\3') ,'MM/DD/YYYY')
else null end
, 'MM/DD/YYYY' ) dtconv
from dats
;
Проблема с 23018 состояла в том, что 22818 будет работать, но 30 февраля 2018 года не существует.