我遇到此查询的问题:
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'
请帮助谢谢。
答案 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()。