Давайте запустим его без оболочки to_date(..., ...)
:
select '04'||EXTRACT(YEAR FROM SYSDATE)-1 from dual;
'04'||EXTRACT(YEARFROMSYSDATE)-1
--------------------------------
42019
Вы видите проблему? (Обратите внимание, что результатом является число, даже не строка.)
Конкатенация выполняется перед тем, как вычесть 1. Сначала вы получаете строку '042020', а затем вычитаете 1; строка преобразуется в число, и вы получите результат 42019. Когда вы применяете TO_DATE()
, она преобразуется обратно в строку, и первое, что Oracle захлебнется, это 42
в течение месяца.
Используйте круглые скобки вокруг арифметической операции c, чтобы сначала было выполнено вычитание, и оно будет работать:
select to_date('04'||(EXTRACT(YEAR FROM SYSDATE)-1), 'MMYYYY') from dual;
TO_DATE('04'||(EXTR
-------------------
2019-04-01 00:00:00