这是一个过程的入参,date型,只能是入参 2015-08类似这样的 yyyy-mm,现在需求是用户传入这个参数,也就是yyyy-mm,过程需要查询mm这个月的整个数据,后台就是between mm-01 到 mm-31 类似这样的where条件
我自己的方法是这样的,但是感觉好别扭,有没有更简单的写法,谢谢哈,‘2015-08’ 是模拟传入参数
select * from dual
where AppDATE between to_char(trunc(add_months(last_day(to_date('2015-08','yyyy-mm')), -1) + 1), 'yyyy-mm-dd')
and to_char(last_day(to_date('2015-08','yyyy-mm')), 'yyyy-mm-dd')
我自己的方法是这样的,但是感觉好别扭,有没有更简单的写法,谢谢哈,‘2015-08’ 是模拟传入参数
select * from dual
where AppDATE between to_char(trunc(add_months(last_day(to_date('2015-08','yyyy-mm')), -1) + 1), 'yyyy-mm-dd')
and to_char(last_day(to_date('2015-08','yyyy-mm')), 'yyyy-mm-dd')
declare
v_date varchar2(50);
begin
select '2015-08'||'-01' into v_date from dual;
dbms_output.put_line(v_date);
end;declare
v_date varchar2(50);
begin
select '2015-08'||'-31' into v_date from dual;
dbms_output.put_line(v_date);
end;
where AppDATE like '2015-08'||'-%',
这样写有可能会导致如果AppDATE中有非正常日期数据也被选出来,但日期控制应该在之前的数据处理做好控制。
AppDATE >= to_date('2015-09-01','yyyy-mm-dd') and AppDATE<add_months(to_date('2015-09-01','yyyy-mm-dd'),1)-1
select trunc(sysdate,'yy') from dual --2015-1-1 返回当年第一天
select trunc(sysdate,'dd') from dual --2015-9-16 返回当前年月日
所以上面好些都是错误的,楼主可以自己带进数据库试试
LAST_DAY(to_date(mon, 'yyyymmdd')) AS MON_LAST
from (select to_char(sysdate, 'yyyy') || to_char(aa, '09') || '01' mon
from (select level aa from dual connect by level <= 12));2015/1/1 2015/1/31
2015/2/1 2015/2/28
2015/3/1 2015/3/31
2015/4/1 2015/4/30
2015/5/1 2015/5/31
2015/6/1 2015/6/30
2015/7/1 2015/7/31
2015/8/1 2015/8/31
2015/9/1 2015/9/30
2015/10/1 2015/10/31
2015/11/1 2015/11/30
2015/12/1 2015/12/31
LAST_DAY(TRUNC(DATE '2015-08-01', 'mm')) AS b
FROM DUAL;这个 '-01' 想办法拼接