我现在要在数据库中执行一个这样的查询.
(((输入一个月份,输出同个季度的其他月份数)))
也就是说当前是200908,然后就输出一个当前季度的`最小月与最大月`` 200907 - 200909下面是我写的方法(oracle库):
  IF(chargeMonth>=0 and chargeMonth<=3)THEN
       BYearMonth:= to_number(to_char(chargeYear) || '01');
       EYearMonth:= to_number(to_char(chargeYear) ||'03');
     END IF;
     IF(chargeMonth>=4 and chargeMonth<=6)THEN
       BYearMonth:= to_number(to_char(chargeYear) || '04');
       EYearMonth:= to_number(to_char(chargeYear) ||'06');
     END IF;
     .............问还有别的更好的方法吗????急``!

解决方案 »

  1.   

    DECLARE inDateStr varchar2(12);
            inDate DATE;
            MaxDate DATE;
            MinDate DATE;
    BEGIN
        inDateStr :='200908';
        inDate := TO_DATE(inDateStr,'YYYYMM');
        SELECT MAX(A.OUTDATE), MIN(A.OUTDATE) INTO MaxDate,MinDate
        FROM
        (
        SELECT ADD_MONTHS(inDate,1) AS OUTDATE FROM DUAL
        UNION
        SELECT ADD_MONTHS(inDate,2) FROM DUAL
        UNION
        SELECT ADD_MONTHS(inDate,-1) FROM DUAL
        UNION
        SELECT ADD_MONTHS(inDate,-2) FROM DUAL
        ) A
        WHERE TO_CHAR(A.OUTDATE,'YYYY-Q') = TO_CHAR(inDate,'YYYY-Q');
    END;
      

  2.   

    用这个就可以搞定了SQL> Select trunc(sysdate,'Q') from dual;
    TRUNC(SYSDATE,
    --------------
    01-7月 -09如果是10g的版本或者above的话,可以直接用
    一些sql达到你的目的
    SQL> Select to_char(add_months(trunc(sysdate,'Q'), rownum-1), 'yyyymm') months 
    from dual connect by rownum <=3;
    MONTHS
    ------
    200907
    200908
    2009099i或者一下的就通过union来解决了
    Select to_char(add_months(trunc(sysdate,'Q'), 0), 'yyyymm') months from dual
    union
    Select to_char(add_months(trunc(sysdate,'Q'), 1), 'yyyymm') months from dual
    union
    Select to_char(add_months(trunc(sysdate,'Q'), 2), 'yyyymm') months from dual;MONTHS
    ------
    200907
    200908
    200909把sysdate换成你的日期或者是变量就可以了,注意这里如果日期是字符串的话,要用to_date转一下。
      

  3.   

    如果是要最大和最小的月份,可以对上面的查询做个max(), min()比如
    select to_char(min(months), 'yyyymm') minM, to_char(max(months), 'yyyymm') maxM from (Select add_months(trunc(sysdate,'Q'), rownum-1) months 
    from dual connect by rownum <=3); MINM   MAXM
    ------ ------
    200907 200909
      

  4.   

    不要用sql么,一定要存储过程么如果一定要存储过程的话,可以用用select into的方式把上面的sql结果写到你的out变量里就可以了。
      

  5.   

    Select add_months(trunc(sysdate,'Q'), rownum-1) months 
    from dual connect by rownum <=3; 这一小段``能详解一下吗?``高手啊``!
      

  6.   

    这里都是oracle内含的public的function,通过名字就基本上知道含义了add_months 加指定月数
    trunc就是做一定的四舍五入,这里'Q'表示用季度来做四舍五入connect by是oracle提供的一种树查找的方法,当结果满足是继续下一条的意思。10g可以用以上的方式,oracle9i里有bug,用以上的方式只出来最前的一条,这个已经有很多网友验证过了,我也验证过。以上各知识点都可以通过google查得到很详细的用法的。