Oracle PL / SQL - 不是有效月份错误

时间:2018-03-15 11:10:07

标签: oracle plsql

我正在尝试使用Oracle站点的PL / SQL脚本创建日历表: Date Dimension Data Generator

一切都运作良好,但我无法运行第5节的声明:

SELECT *
FROM TABLE(UDF_CALENDAR_GENERATOR(CAST('1-JAN-2016' AS DATE), CAST('31-DEC-2016' AS DATE)));

我收到错误:

  
      
  1. 00000 - “不是有效月份”
  2.         

    *原因:
      *操作:

我尝试使用to_date函数(基于od this answer):

SELECT *
FROM TABLE(UDF_CALENDAR_GENERATOR(TO_DATE('14-Apr-2015', 'DD-MON-YYYY'), TO_DATE('14-May-2015', 'DD-MON-YYYY')));

但它不起作用。这句话有什么问题?

4 个答案:

答案 0 :(得分:5)

SELECT *
FROM TABLE(
    UDF_CALENDAR_GENERATOR(
        TO_DATE('14-Apr-2015', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American'), 
        TO_DATE('14-May-2015', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American')
    )
);

答案 1 :(得分:5)

有人应该告诉作者,在Oracle中,date literals的编写方式与date '2016-01-01'类似,因此查询应为:

select *
from   table(udf_calendar_generator(date '2016-01-01', date '2016-12-31'));

CAST()表达式实际上是TO_DATE(),没有指定日期格式或语言,需要运气元素才能在任何给定环境中工作。

答案 2 :(得分:4)

必须是日期格式问题,请确保您的日期格式为DD-MON-YYYY,并且由于您使用的是英语,请确保您的日期是英语:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

ALTER SESSION SET NLS_DATE_LANGUAGE = 'American';

答案 3 :(得分:1)

查找默认日期格式: SELECT * FROM NLS_SESSION_PARAMETERS;

在sql developer中: 在查询开始时: 更改会话集NLS_DATE_FORMAT ='MM / DD / YYYY';

查询结束时

(以返回默认格式): 更改会话集NLS_DATE_FORMAT ='DD-MON-RR';

但是存储过程不同。 开始之后: 立即执行'更改会话集NLS_DATE_FORMAT =``MM / DD / YYYY''';

在存储过程结束时,在“ END”之前: 立即执行'更改会话集NLS_DATE_FORMAT =``DD-MON-RR''';