从Oracle ORA-01722中的日期中提取月份和年份:无效

时间:2018-10-17 09:25:33

标签: oracle plsql

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

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

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

但是它返回以下异常

  

ORA-01722:无效”

2 个答案:

答案 0 :(得分:3)

您需要在此执行两个步骤。首先,使用TO_DATE将文本日期转换为真实日期,然后调用TO_CHAR将其格式化为所需的格式:

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

OCT-08

Demo

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

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

答案 1 :(得分:1)

'01/10/2008'是字符串,而不是日期。共有四个to_char()函数,它们采用不同的参数类型,并且(大概是由于隐含的conversion优先级),实际上您实际上是在调用to_char(number),而不是您调用的(date)版本

这意味着您正在有效地进行TO_CHAR(TO_NUMBER('01/10/2008'), 'MON-YY'),而隐含的TO_NUMBER('01/10/2008')会抛出ORA-01722。

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

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