【请教高手】在plsql和oracle环境下,如何用sql语句实现计算“月数”???比如: 计算两个日期之间的“月数”:
               200607---200708
               20060701---20070831
而且这两个有何区别???               2006-07---2007-08
               2006-07-01---2007-08-31在plsql和oracle环境下,如何用sql语句实现计算“月数”???

解决方案 »

  1.   

    给你个函数create or replace function fun_month_num ( 
    var_begin_date in varchar2, 
    var_end_date in varchar2 

    return number 
    as
    is_begin_date date; 
    is_end_date date; 
    is_count number(10); 
    i number(10); 
    j number(10); 
    is_this_date date; 
    begin 
    is_begin_date := to_date(var_begin_date,'yyyy-mm-dd'); 
    is_end_date := to_date(var_end_date,'yyyy-mm-dd'); 
    is_this_date := last_day(is_end_date) ; 
    is_count := 0 ; loop 
    exit when is_this_date < last_day(is_begin_date)+1 ; 
    is_count := is_count+1; 
    is_this_date := last_day(is_this_date)-32; end loop; return is_count; 
    end; /测试SQL>select fun_month_num('2004-09-30','2005-02-01') from dual; FUN_MONTH_NUM('2004-09-30','2005-02-01') 
      

  2.   


    SQL> select months_between(to_date(200708,'yyyymm'),to_date(200607,'yyyymm')) from dual;        MONTHS_BETWEEN(TO_DATE(200708,
    ------------------------------
                                13
    SQL> select months_between(to_date(20070831,'yyyymmdd'),to_date(20060701,'yyyymmdd')) from dual; 
    MONTHS_BETWEEN(TO_DATE(2007083
    ------------------------------
                        13.9677419楼主看这个例子就明白了吧
      

  3.   

    又如果:  日期都为“字段”aae002(日期型),又如何计算月数????
    这样可以吗???
    SQL>select months_between(to_date(aae002,'yyyymm'),to_date(aae002,'yyyymm'))from dual; 
      

  4.   

    一、
    200607---200708  之间应该是多少个月????  13个月还是14个月?????? 20060701---20070831  之间应该是多少个月????  13个月还是14个月?????? 
    这个是你自己需求问题,你自己应该最清楚;二、
    又如果:  日期都为“字段”aae002(日期型),又如何计算月数???? 
    这样可以吗??? 
    SQL>select months_between(to_date(aae002,'yyyymm'),to_date(aae002,'yyyymm'))from dual; 这么简单的东西为什么自己不进pl/sql试一下?
      

  5.   

    用简单的一个sql就搞定了
    select to_number(to_char(to_date('200909','yyyymm'),'yyyy'))*12+to_number(to_char(to_date('200909','yyyymm'),'mm')) 
           - (to_number(to_char(to_date('200812','yyyymm'),'yyyy'))*12+to_number(to_char(to_date('200812','yyyymm'),'mm'))) from dual;
      

  6.   

    要用上日期字段:aae002
      

  7.   

    --1:当输入日期只精确到月份时,无具体某一天,是整数,所以无须ROUND或TRUNC函数
    SELECT MONTHS_BETWEEN(TO_DATE('2006-05','yyyy-mm'),TO_DATE('2003-12','yyyy-mm')) FROM DUAL; --2:当输入日期精确到具体某一天时,月份出来带小数部分,此时要用ROUND函数取整
    --    当然:你也可以用TRUNC函数截断小数部分,这主要看你的业务规则了
    SELECT ROUND(MONTHS_BETWEEN(TO_DATE('2006-05-01','yyyy-mm-dd'),TO_DATE('2003-12-16','yyyy-mm-dd'))) FROM DUAL;
    SELECT ROUND(MONTHS_BETWEEN(TO_DATE('2006-05-01','yyyy-mm-dd'),TO_DATE('2003-12-16','yyyy-mm-dd'))) FROM DUAL;
      

  8.   

    SQL>select months_between(to_date(aae002,'yyyymm'),to_date(aae002,'yyyymm'))from dual;这里的aaa002是什么东西呀,执行会出错的吧。SQL> select months_between(sysdate, sysdate) from dual;MONTHS_BETWEEN(SYSDATE,SYSDATE)
    -------------------------------
                                  0
    比如: 计算两个日期之间的“月数”: 
                  200607---200708 
                  20060701---20070831 
    而且这两个有何区别???               2006-07---2007-08 
                  2006-07-01---2007-08-31 
    200607---200708 结果和 2006-07---2007-08 一致。
    20060701---20070831 结果和 2006-07-01---2007-08-31 一致由于上面的只到月份的,所以不会出现小数
    下面是到日期的,所以计算的时候,是会出现小数的,当然也可能不出现小数,关键是看是不是相差是月份的整数比如你这里2006-07-01---2007-08-31 返回的就是小数
    SQL> select months_between(to_date('20060701','yyyymmdd'), to_date('20070831', '
    yyyymmdd')) result from dual;    RESULT
    ----------
    -13.967742如果是2006-07-01---2007-08-01就是正好整月了
    SQL> select months_between(to_date('20060701','yyyymmdd'), to_date('20070801', '
    yyyymmdd')) result from dual;    RESULT
    ----------
           -13这个问题是很基础的题了,你自己在sqlplus运行运行就知道结果了。