根据输入的日期计算周次和月份
需求:
1.根據(jù)輸入的日期拆分成按周或按月顯示
2.規(guī)定周的開始日期從星期一開始,星期日結(jié)束
3.不足7天的一周,如果小于2天,則合并到上周或下周;大于2天的則自成一周
?
代碼:
CREATE OR REPLACE PROCEDURE printWeekAndMonth(fromdate in varchar2, todate in varchar2)
IS
?? l_getdate VARCHAR2(255) ;--轉(zhuǎn)換后的臨時時間
?? v_i NUMBER(10);
?? l_tmpdate1 VARCHAR2(255);????? --臨時時間
?? l_tmplastdate VARCHAR2(255);?? --得到臨時當(dāng)月最后一天
?? type v_array IS VARRAY(7) OF VARCHAR2(20);
?? v_arr v_array;
BEGIN
? l_tmplastdate:= to_char(LAST_DAY(to_date(fromdate,'YYYY-MM-DD')),'YYYY-MM-DD');
? dbms_output.put_line('=================打印周次====================');
? v_arr := v_array('星期一','星期二','星期三','星期四','星期五','星期六','星期日');
? --如果輸入的開始日期為星期一
? if to_char(to_date(fromdate,'yyyy-mm-dd'),'day') = v_arr(1) then
???? l_getdate := to_char(to_date(fromdate,'yyyy-mm-dd'),'yyyy-mm-dd');--一周開始日期
? else
??? --不為星期一,則計算下個星期一的日期
??? for i in 1..v_arr.count loop
??????? if v_arr(i) = to_char(to_date(fromdate,'yyyy-mm-dd'),'day') then
????????? --dbms_output.put_line(fromdate || '所在的星期為:' || v_arr(i));
????????? l_getdate := to_char(to_date(fromdate,'yyyy-mm-dd')+8-i,'yyyy-mm-dd');--一周開始日期
????????? if i > 5 then --開始日期范圍在星期六到星期天,合并到下周
??????????? dbms_output.put_line(to_char(to_date(fromdate,'yyyy-mm-dd'),'yyyy-mm-dd') || '~' || to_char(to_date(l_getdate,'yyyy-mm-dd')+6,'yyyy-mm-dd'));--需要插入到表中...
??????????? l_getdate :=? to_char(to_date(l_getdate,'yyyy-mm-dd')+7,'yyyy-mm-dd');
????????? else --開始日期范圍在星期二到星期五,自成一周
??????????? dbms_output.put_line(to_char(to_date(fromdate,'yyyy-mm-dd'),'yyyy-mm-dd') || '~' || to_char(to_date(l_getdate,'yyyy-mm-dd')-1,'yyyy-mm-dd'));--需要插入到表中...
????????? end if;
????????? end if;
??? end loop;
? end if;
? l_tmpdate1 := l_getdate;
? while to_date(l_tmpdate1,'yyyy-mm-dd')+14 <= to_date(todate,'yyyy-mm-dd') loop --排除結(jié)束日期所在周和前一周
??? l_tmpdate1 := to_char(to_date(l_getdate,'yyyy-mm-dd')+6,'yyyy-mm-dd');--一周結(jié)束日期=一周開始日期+6
??? dbms_output.put_line(l_getdate || '~' || l_tmpdate1);--需要插入到表中
??? l_getdate := to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+1,'yyyy-mm-dd');--一周開始日期=一周結(jié)束日期+1
? end loop;
? v_i := to_date(todate,'yyyy-mm-dd')-to_date(l_tmpdate1,'yyyy-mm-dd');
? --dbms_output.put_line('最后兩周的天數(shù):' || v_i);
? if v_i = 14 then
??? dbms_output.put_line(to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+1,'yyyy-mm-dd') || '~' || to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+7,'yyyy-mm-dd'));
??? dbms_output.put_line(to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+8,'yyyy-mm-dd') || '~' || to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+14,'yyyy-mm-dd'));
? else if v_i <= 10 then
??? dbms_output.put_line(to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+1,'yyyy-mm-dd') || '~' || to_char(to_date(todate,'yyyy-mm-dd'),'yyyy-mm-dd'));
? else if v_i > 10 and v_i < 14 then
??? dbms_output.put_line(to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+1,'yyyy-mm-dd') || '~' || to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+7,'yyyy-mm-dd'));
??? dbms_output.put_line(to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+8,'yyyy-mm-dd') || '~' || to_char(to_date(todate,'yyyy-mm-dd'),'yyyy-mm-dd'));
? end if;
? end if;
? end if;
?
? dbms_output.put_line('=================打印月份====================');
? l_tmpdate1:=fromdate;
? WHILE (to_date(l_tmpdate1,'YYYY-MM-DD')-(to_date(todate,'YYYY-MM-DD'))) <= 0? LOOP
???? DBMS_OUTPUT.PUT_LINE( l_tmpdate1 || '~' || l_tmplastdate);
???? --計算下個月時間
???? l_tmpdate1 := to_char(to_date(l_tmplastdate,'YYYY-MM-DD')+1,'YYYY-MM-DD');
???? l_tmplastdate:= to_char(LAST_DAY(to_date(l_tmpdate1,'YYYY-MM-DD')),'YYYY-MM-DD');
? END LOOP;
END? printWeekAndMonth;
?
運行示例:
begin
? -- Call the procedure
? printweekandmonth(fromdate => '2012-01-01',
??????????????????? todate => '2012-12-31');
end;
=================打印周次====================
2012-01-01~2012-01-08
2012-01-09~2012-01-15
2012-01-16~2012-01-22
2012-01-23~2012-01-29
2012-01-30~2012-02-05
2012-02-06~2012-02-12
2012-02-13~2012-02-19
2012-02-20~2012-02-26
2012-02-27~2012-03-04
2012-03-05~2012-03-11
2012-03-12~2012-03-18
2012-03-19~2012-03-25
2012-03-26~2012-04-01
2012-04-02~2012-04-08
2012-04-09~2012-04-15
2012-04-16~2012-04-22
2012-04-23~2012-04-29
2012-04-30~2012-05-06
2012-05-07~2012-05-13
2012-05-14~2012-05-20
2012-05-21~2012-05-27
2012-05-28~2012-06-03
2012-06-04~2012-06-10
2012-06-11~2012-06-17
2012-06-18~2012-06-24
2012-06-25~2012-07-01
2012-07-02~2012-07-08
2012-07-09~2012-07-15
2012-07-16~2012-07-22
2012-07-23~2012-07-29
2012-07-30~2012-08-05
2012-08-06~2012-08-12
2012-08-13~2012-08-19
2012-08-20~2012-08-26
2012-08-27~2012-09-02
2012-09-03~2012-09-09
2012-09-10~2012-09-16
2012-09-17~2012-09-23
2012-09-24~2012-09-30
2012-10-01~2012-10-07
2012-10-08~2012-10-14
2012-10-15~2012-10-21
2012-10-22~2012-10-28
2012-10-29~2012-11-04
2012-11-05~2012-11-11
2012-11-12~2012-11-18
2012-11-19~2012-11-25
2012-11-26~2012-12-02
2012-12-03~2012-12-09
2012-12-10~2012-12-16
2012-12-17~2012-12-23
2012-12-24~2012-12-31
=================打印月份====================
2012-01-01~2012-01-31
2012-02-01~2012-02-29
2012-03-01~2012-03-31
2012-04-01~2012-04-30
2012-05-01~2012-05-31
2012-06-01~2012-06-30
2012-07-01~2012-07-31
2012-08-01~2012-08-31
2012-09-01~2012-09-30
2012-10-01~2012-10-31
2012-11-01~2012-11-30
2012-12-01~2012-12-31
?
總結(jié)
以上是生活随笔為你收集整理的根据输入的日期计算周次和月份的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取网址中参数的方式
- 下一篇: 计算机技术与人工智能基础赵学军答案,《人