тип данных число (8)
Затем необходимо указать модель формата для преобразования этого числа в дату; вместо
to_date(max(mem.birth_date))
вам нужно сделать:
to_date(max(mem.birth_date), 'YYYYMMDD')
или даже более явно:
to_date(to_char(max(mem.birth_date)), 'YYYYMMDD')
В данный момент ваш код использует настройки NLS текущего сеанса для получения используемой модели формата, и ошибка означает, что она не соответствует передаваемому вами значению. Причина, по которой ваш коллега может успешно выполнить один и тот же запрос, заключается в том, что его сеанс имеет разные настройки NLS. Вот почему вы не должны полагаться на настройки NLS (или неявные преобразования - они часто идут вместе), поскольку вы не можете контролировать, как другие люди будут выполнять ваш код.
Вы можете увидеть эффект на урезанном примере:
alter session set nls_date_format = 'DD-Mon-RR';
with mem (birth_date) as (select 20190328 from dual)
select NVL(to_char(add_months(to_date(max(mem.birth_date)), + 780), 'yyyymmdd'), ' ')
from mem;
ORA-01861: literal does not match format string
или даже проще:
with mem (birth_date) as (select 20190328 from dual)
select to_date(max(mem.birth_date))
from mem;
ORA-01861: literal does not match format string
Добавление формата модели приводит к дате:
with mem (birth_date) as (select 20190328 from dual)
select to_date(max(mem.birth_date), 'YYYYMMDD')
from mem;
TO_DATE(M
---------
28-Mar-19
и ваши настройки и преобразования теперь тоже работают:
with mem (birth_date) as (select 20190328 from dual)
select NVL(to_char(add_months(to_date(max(mem.birth_date), 'YYYYMMDD'), + 780), 'yyyymmdd'), ' ')
from mem;
NVL(TO_C
--------
20840328
Вы должны также хранить даты как даты , а не как числа, но это отдельная проблема ...