我正在尝试使用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)));
我收到错误:
- 00000 - “不是有效月份”
醇>*原因:
*操作:
我尝试使用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')));
但它不起作用。这句话有什么问题?
答案 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''';