Когда вы выполните выбор только 18-го числа (с которым у вас не было проблем) и добавив необработанное значение, вы увидите, что оно возвращает
with a as
(select to_char(to_date('20190518', 'YYYYMMDD'),
'YYYYMMDD',
'NLS_CALENDAR=PERSIAN') PERSIAN_DATE
from DUAL)
SELECT PERSIAN_DATE, TO_DATE(PERSIAN_DATE, 'YYYY/MM/DD') pers_date FROM A;
Persian Date pers_date
13980228 28/FEB/98 00:00:00
Итак, оракул пытается отбросить первые два символа и сделать лучшую дату из остальных (почти наверняка это не правильная персидская дата).
Таким образом, следуя той же логике, когда вы запускаете это для 19-го числа (мы можем получить только необработанное значение на дату, будет ошибка)
with a as
(select to_char(to_date('20190519', 'YYYYMMDD'),
'YYYYMMDD',
'NLS_CALENDAR=PERSIAN') PERSIAN_DATE
from DUAL)
SELECT PERSIAN_DATE pers_date FROM A;
Persian Date
13980229
Следуя той же логике, что и выше, отбросьте первые два символа, и вы получите 29 февраля 1998 года ... это недопустимая дата.
Как отмечали другие в комментариях, Oracle просто хранит дату, которая не заботится о календаре, вам необходимо преобразовать ее в соответствующий календарь для отображения.
Хорошее объяснение того, как оракул хранит даты, смотрите
Как даты хранятся в Oracle?