与前导零连接几个月 - 不是有效的月份错误

concatenate with leading zeros for months - not a valid month error

我想在 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;

让我们 运行 它没有 to_date(..., ...) 包装器:

select '04'||EXTRACT(YEAR FROM SYSDATE)-1 from dual;

'04'||EXTRACT(YEARFROMSYSDATE)-1
--------------------------------
                           42019

你看到问题了吗? (注意结果是数字,甚至不是字符串。)

在减1之前先拼接,先得到字符串'042020',然后再减1;字符串被转换为数字,你得到结果 42019。当你应用 TO_DATE() 时,它被转换回字符串,Oracle 将阻塞的第一件事是月份的 42

在算术运算两边用括号强制先做减法,就可以了:

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

TO_DATE('04'||(EXTR
-------------------
2019-04-01 00:00:00