【问题标题】:Extract month and year from date in oracle ORA-01722: Nombre non valide从 oracle ORA-01722 中的日期中提取月份和年份:Nombre non valide
【发布时间】:2018-10-17 17:53:52
【问题描述】:

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

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

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

但它返回以下异常

ORA-01722:名词无效

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    这里需要两个步骤。首先,使用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;
    

    【讨论】:

      【解决方案2】:

      '01/10/2008' 是字符串,而不是日期。有四个 to_char() 函数采用不同的参数类型,并且(可能是因为隐含的 conversion 优先级)你实际上最终调用了 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
      

      【讨论】:

        猜你喜欢
        • 2018-02-16
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        相关资源
        最近更新 更多