这是一个过程的入参,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')

解决方案 »

  1.   

    难道要用这种拼接的方式吗。。
    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;
      

  2.   

    AppDATE between to_char(trunc(add_months(last_day(to_date('2015-08','yyyy-mm')), -1) + 1), 'yyyy-mm-dd') 这句,直接拼接成 yyyy-mm-01 的形式,不是更好吗?
      

  3.   

    where AppDATE  >='2015-08'||'01' and AppDATE < to_char(add_months('2015-08',1),'yyyy-mm-dd') 
      

  4.   

    如果只查传入的某一个月的话,这样也可以啊
    where AppDATE like '2015-08'||'-%',
    这样写有可能会导致如果AppDATE中有非正常日期数据也被选出来,但日期控制应该在之前的数据处理做好控制。
      

  5.   

    where trunc(AppDATE  ,'mm') = to_date('201508','yyyymm')
      

  6.   

    select * from table where  trunc(time,'DD') = '2015-08'
      

  7.   

    to_char来比较日期效率低下,应该用日期比较
    AppDATE >= to_date('2015-09-01','yyyy-mm-dd') and AppDATE<add_months(to_date('2015-09-01','yyyy-mm-dd'),1)-1
      

  8.   

    直接trunc(date)就可以直接截取到当前年月
      

  9.   

    select trunc(sysdate, 'mm')   from   dual  --2015-9-1    返回当月第一天.
    select trunc(sysdate,'yy') from dual  --2015-1-1       返回当年第一天
    select trunc(sysdate,'dd') from dual  --2015-9-16    返回当前年月日
    所以上面好些都是错误的,楼主可以自己带进数据库试试
      

  10.   

    select to_date(mon, 'yyyymmdd') AS MON_FIRST,
           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
      

  11.   

    把AppDATE也转换成‘yyyy-mm’再比较
      

  12.   

    SELECT TRUNC(DATE '2015-08-01', 'mm') AS a,
           LAST_DAY(TRUNC(DATE '2015-08-01', 'mm')) AS b
      FROM DUAL;这个 '-01' 想办法拼接