ORA-01847获取日期出错

时间:2016-11-25 15:47:01

标签: sql oracle

我遇到此查询的问题:

select to_char(ADD_MONTHS((LAST_DAY(to_date(DATEVAR, 'yyyymmdd'))+1),-1),'yyyymmdd') from mytable 
where ROWNUM=1 
and var = to_char(last_day(to_date(DATEVAR, 'yyyyMMdd')), 'WW')-1; 

我希望它在var是月的最后一周数时返回,如果不是我的var是'29'(weekNumber)则返回null我得到:

  

ORA-01847:“每月的日期必须介于1月的最后一天”

但如果我将周数改为'30'(本月的上周数字),我会得到正确的结果:

'20160701'

请帮助谢谢。

1 个答案:

答案 0 :(得分:0)

我的代码没有问题? var设置为30:

WITH mytable AS (SELECT trunc(SYSDATE, 'yyyy') - 1 + LEVEL datevar
                 FROM   dual
                 CONNECT BY LEVEL <= 366)
SELECT to_char(add_months((last_day(datevar) + 1), -1), 'yyyymmdd') ret_col
FROM   mytable
WHERE  rownum = 1
AND    30 = to_number(to_char(last_day(datevar), 'WW'))- 1;

RET_COL
--------
20160701

在上面的查询中将30更改为29,并且我没有返回任何行。

我唯一能想到的是你的datevar列的数据类型为VARCHAR2而不是DATE,并且由于你的NLS_DATE_FORMAT设置,你会遇到一些隐含的日期转换问题。

N.B。编辑了我的查询以删除datevar上的to_date(),因为我将日期变量定义为DATE,这是一件非常愚蠢的事情!感谢@mathguy。)另外,在where子句中添加了明确的to_number()。