日期:2014-05-17  浏览次数:20788 次

传年月,如何通过SQL算出传的月的起止日期和其上一个月的起止日期?
本帖最后由 lyshrine 于 2013-05-13 10:22:30 编辑
如题:
传的格式为YYYYMM
比如我传一个 201301
得到1月份的起止日期   2013-01-01    2013-01-31 
                 和1月份所在的年 2013  以及 月份 01
得到1月份上一个月的 起止日期 2012-12-01  2012-12-31
                 和12月份所在的年 2012  以及 月份 12

以前是固定的sysdate,现在需要改成传年月的

 
  select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd')  into v_lm_firstday from dual;
  select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd')  into v_lm_lastday from dual;
  select to_char(add_months(last_day(sysdate)+1,-1),'yyyy-MM-dd')   into v_tm_firstday from dual;
  select to_char(last_day(sysdate),'yyyy-MM-dd')  into v_tm_lastday from dual;
  select to_char(add_months(last_day(sysdate)+1,-2),'yyyy')   into v_lastyear from dual;
  select to_char(add_months(last_day(sysdate)+1,-2),'MM')  into v_lastmonth from dual;
  select to_char(add_months(last_day(sysdate)+1,-1),'yyyy')  into v_thisyear from dual;
  select to_char(last_day(sysdate),'MM')  into v_thismonth from dual;

------解决方案--------------------

declare
  v_month varchar2(6) :=&v_month;
  v_first_day varchar2(12);
begin
  v_first_day:=to_date(v_month
------解决方案--------------------
'01','yyyy--mm-dd');
  dbms_output.put_line(v_first_day);
end;

剩下的建议楼主自己尝试下吧,这个其实都很简单的。

------解决方案--------------------
把sysdate换成to_date(' 201301'
------解决方案--------------------
'01','yyyymmdd') 就可以了
------解决方案--------------------
SQL> set serveroutput on
SQL> declare v_date varchar2(20);
  2  begin
  3  v_date:=&1;
  4  dbms_output.put_line(to_date(v_date,'yyyy-mm'));
  5  dbms_output.put_line(last_day(to_date(v_date,'yyyy-mm')));
  6  dbms_output.put_line(add_months(to_date(v_date,'yyyy-mm'),-1));
  7  dbms_output.put_line(last_day(add_months(to_date(v_date,'yyyy-mm'),-1)));
  8  end;
  9  /
输入 1 的值:  201301
原值    3: v_date:=&1;
新值    3: v_date:=201301;
2013-01-01
2013-01-31
2012-12-01
2012-12-31

PL/SQL 过程已成功完成。