объединять с ведущими нулями по месяцам - недопустимая ошибка месяца - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу объединить строку с годом в oracle. Строка месяц. Запрос

 select to_date('11'||EXTRACT(YEAR FROM SYSDATE)-1,'MMYYYY') from dual;

Этот запрос работает нормально, однако, если строка '01' или что-то, начинающееся с нуля, я получаю недопустимую ошибку месяца.

select to_date('04'||EXTRACT(YEAR FROM SYSDATE)-1,'MMYYYY') from dual;
select to_date('05'||EXTRACT(YEAR FROM SYSDATE)-1,'MMYYYY') from dual;

1 Ответ

2 голосов
/ 24 апреля 2020

Давайте запустим его без оболочки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...