从 oracle ORA-01722 中的日期中提取月份和年份:Nombre non valide



所以我正在尝试从示例的日期中提取月份和年份:01/07/2018将返回"JUL-18">

我正在尝试这个简单的查询来尝试提取

select TO_CHAR('01/10/2008','MON-YY') from dual

但它返回以下异常

ORA-01722: Nombre non valide

这里需要两个步骤。 首先,使用TO_DATE将文本日期转换为真实日期,然后调用TO_CHAR以按所需方式设置其格式:

SELECT TO_CHAR(TO_DATE('01/10/2008', 'DD/MM/YYYY'), 'MON-YY')
FROM dual;
OCT-08

演示

注意:如果可能,最好只使用有效的 Oracle 日期文本。 例如,以下查询避免调用TO_DATE

SELECT TO_CHAR(DATE '2008-10-01', 'MON-YY')
FROM dual;

'01/10/2008'是一个字符串,而不是日期。有四个to_char()函数采用不同的参数类型,并且(可能是因为隐式转换优先级(您实际上最终调用了to_char(number),而不是您想要的(date)版本。

这意味着您正在有效地执行TO_CHAR(TO_NUMBER('01/10/2008'), 'MON-YY'),并且是抛出ORA-01722的隐式TO_NUMBER('01/10/2008')

如果您从该字符串开始并尝试有效地更改格式,则需要先显式转换为日期,然后再转换回字符串:

select TO_CHAR(TO_DATE('01/10/2008', 'DD/MM/YYYY'), 'MON-YY') from dual;
TO_CHA
------
OCT-08

由于月份名称和缩写取决于 NLS 设置,因此您可能希望覆盖会话设置以获得一致的结果:

alter session set NLS_DATE_LANGUAGE='FRENCH';
select TO_CHAR(TO_DATE('01/07/2018', 'DD/MM/YYYY'), 'MON-YY') from dual;
TO_CHAR(
--------
JUIL.-18
select TO_CHAR(TO_DATE('01/07/2018', 'DD/MM/YYYY'), 'MON-YY',
'NLS_DATE_LANGUAGE=ENGLISH') from dual;
TO_CHA
------
JUL-18

相关内容

最新更新