Не существует автоматического способа сделать это, или волшебной модели формата даты, которая может справиться с этим.Вам придется больше манипулировать номером источника (в виде строки), исходя из его длины.
Демонстрация, при условии, что всегда есть 6-8 цифр:
-- CTE for some sample numbers
with cte (num) as (
select 532019 from dual
union all select 5032019 from dual
union all select 05032019 from dual
union all select 12032018 from dual
union all select 1232018 from dual
union all select 1112018 from dual
)
select num,
case when length(num) = 6 then '0' || substr(num, 1, 1)
|| '0' || substr(num, 2, 5)
else to_char(num, 'FM00000000')
end as full_num,
to_date(case when length(num) = 6 then '0' || substr(num, 1, 1)
|| '0' || substr(num, 2, 5)
else to_char(num, 'FM00000000')
end, 'MMDDYYYY') as full_date
from cte;
NUM FULL_NUM FULL_DATE
---------- --------- ----------
532019 05032019 2019-05-03
5032019 05032019 2019-05-03
5032019 05032019 2019-05-03
12032018 12032018 2018-12-03
1232018 01232018 2018-01-23
1112018 01112018 2018-01-11
Однакоэто действительно не должно быть необходимым;и обратите внимание на двусмысленность, особенно в последнем ряду - должно ли быть расширено 1112018 до 01112018 или 11012018?У вас нет возможности узнать.
Я предлагаю вам поговорить с тем, кто отправляет вам эти данные, и попросить их исправить процесс в конце, желательно всегда передавать однозначное набранное нулем 8-значное число -или, что еще лучше, однозначные литералы даты ANSI вместо цифр.