需求:

1.根据输入的日期拆分成按周或按月显示

2.规定周的开始日期从星期一开始,星期日结束

3.不足7天的一周,如果小于2天,则合并到上周或下周;大于2天的则自成一周

代码:

CREATE OR REPLACE PROCEDURE printWeekAndMonth(fromdate in varchar2, todate in varchar2)
IS
   l_getdate VARCHAR2(255) ;--转换后的临时时间
   v_i NUMBER(10);
   l_tmpdate1 VARCHAR2(255);      --临时时间
   l_tmplastdate VARCHAR2(255);   --得到临时当月最后一天
   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 --排除结束日期所在周和前一周
    l_tmpdate1 := to_char(to_date(l_getdate,'yyyy-mm-dd')+6,'yyyy-mm-dd');--一周结束日期=一周开始日期+6
    dbms_output.put_line(l_getdate || '~' || l_tmpdate1);--需要插入到表中
    l_getdate := to_char(to_date(l_tmpdate1,'yyyy-mm-dd')+1,'yyyy-mm-dd');--一周开始日期=一周结束日期+1
  end loop;

v_i := to_date(todate,'yyyy-mm-dd')-to_date(l_tmpdate1,'yyyy-mm-dd');
  --dbms_output.put_line('最后两周的天数:' || 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

根据输入的日期计算周次和月份相关推荐

  1. 【虚幻引擎】根据日期计算周几

    今天有个小需求,就是根据日期计算周几. 百度搜了一下有现成的公式,蔡勒公式和基姆拉尔森公式.在蓝图中也可以直接写数学表达式.表达式没有推导过程.正好在虚幻中发现这两个节点"年中的天数&quo ...

  2. Hive 根据日期计算周数以及周几

    文章目录 周数 周几 周数 在 Hive 中我们可以通过内置函数 weekofyear(string date) 获取某日期的周数. 示例:select weekofyear("2022-0 ...

  3. 定义日期类,根据输入的日期计算明天日期,上机实践--我的c++之路

    //这个程序有缺点,不能输入每个月最后一天.否则计算出错...可是不知道怎么才能解决,有日期数据类型就好了.以后学习过程中改进吧 #include<iostream.h> class cd ...

  4. 根据输入的日期计算你活了多少天(新手)

    //导入的包.import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;impor ...

  5. Salesforce 公式字段根据日期计算周数

    字段公式 IF( CEILING( ( DATEVALUE( CreatedDate ) - DATE( YEAR( DATEVALUE( CreatedDate ) ), 1, 1) + 1) / ...

  6. python计算excel每个月的平均值_Python:根据日期计算平均值并根据月份显示

    首先把你的数据放到panda数据框中--我自己编了一个虚拟数据--你需要弄清楚如何加载你的数据源.(来自csv或excel). 启动框架 import pandas as pd import date ...

  7. c语言switch判断星座,通过日期计算星座 - osc_d41sfzmu的个人空间 - OSCHINA - 中文开源技术交流社区...

    分析和理解根据日期计算星座函数 起始月份 号数 星座 结束月份 号数 时间区间 12 22 摩羯座 1 19 12/22 - 1/19 1 20 水瓶座 2 18 1/20 - 2/18 2 19 双 ...

  8. C语言输入一个日期,计算这一天是周几

    问题描述:输入一个日期,计算这一天是周几,假设年份和月份的天数是一定的,分别是360天和30天,并且已知一个日期. 首先,要解决一个问题,你要知道真正需要求的是什么. 对于这个题,我们要解决的是已知日 ...

  9. JavaScript根据用户输入动态计算周数

    今天遇到了个问题:根据用户输入动态计算输入日期为第几周. 当然我写的前端肯定不是最好的,至少已经解决了这个问题. 代码如下: function weeksCalculation(startDay) { ...

最新文章

  1. Android开发——Android中常见的4种线程池(保证你能看懂并理解)
  2. Win32和MFC项目如何输出调试信息到VS的调试窗口
  3. Linux 环境安装 Node、nginx、docker、vsftpd、gitlab
  4. 唱好铁血丹心谐音正规_孩子想学唱歌?儿童声乐怎么学才好?
  5. 实现点击到底部、顶部、指定div功能
  6. Delphi XE10编写的《开放式公路收费系统》
  7. jupyter notebook切换到其他配置好的conda虚拟环境
  8. 三维空间刚体运动4-5:四元数多点离散数值解插值方法:Sping
  9. 350 个在家办公的人,创造了估值 10 亿美元的代码共享平台
  10. Windows PE的DIY你都会:那你的电脑知识已经超越了90%的人
  11. dht磁力链php,基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
  12. 极域课堂忘记密码,解决方法,万能密码
  13. as常用固定搭配_as 。。。as 一些常考的固定搭配【重点中考】
  14. Python框架篇:结构化的网页抓取框架-Scrapy
  15. 每日一问-ChapGPT-20230405-中医基础-五运六气三阴三阳
  16. shiro、基于url权限管理、超详细
  17. 详解 – Windows Terminal
  18. 量子领域的机器学习人工智能(一)
  19. 【淘客基地各项目拉新活动海报已开启】公告
  20. 物联网是什么?用途在那里?

热门文章

  1. 前端学习(3146):react-hello-react之getDenvied
  2. [html] 怎样避免让用户看到长时间的白屏?
  3. 前端学习(2965):路由环境的搭建
  4. [html] 如何在不同的端口间共享cookie?
  5. [vue] vue组件会在什么时候下被销毁?
  6. remote: Incorrect username or password ( access token ) fatal: Authentication failed for gitee
  7. 前端学习(2237):react实现疫情数据
  8. 前端学习(2143):webpack的config.js配置和package.json
  9. 前端学习(1295):第三方模块npm
  10. 前端学习(221):字体属性