qq_15361999 2018-06-18 05:01 采纳率: 100%
浏览 1476
已采纳

获取oracle两个时间断的月份与天数

1.2017-01-05至2018-04-05 希望返回 每个月有几天,可以用一个函数或者存储过程来实现

2.因为有大量的数据需要处理,所以返回值需要有对应,也就是说输入(id,起始日期,结束日期) 就可以返回对应的id 每个月的天数: id 月份 天数

  • 写回答

5条回答

  • jamsbwo 2018-06-18 06:14
    关注

    函数设计思路

     --计算相差月份
    循环{
                --赋值当前日期(累加)
                --计算当前年是否闰年
                --追加当前年月和天数
                --当前日期加1
    }
    

    函数内容

     create or replace function GETMONTHANDDAYS(ID VARCHAR2,DATE_START in DATE, DATE_END in DATE) return varchar2 is
      FunctionResult varchar2(2000) := '';
      type num_list is varray(12) of VARCHAR2(2);
      P_DAYS num_list := num_list('31','30','31','30','31','30','31','31','30','31','30','31');
      P_DAYS_RUNNIAN num_list := num_list('31','29','31','30','31','30','31','31','30','31','30','31');
      CUR_DATE DATE;
      CUR_YEAR NUMBER;
      CUR_MONTH NUMBER;
      GE_MONTH NUMBER;
    
    begin
      select ceil(months_between(DATE_END,DATE_START)) INTO GE_MONTH FROM DUAL;
      CUR_DATE := DATE_START;
      if GE_MONTH>0 then
        LOOP
          EXIT WHEN GE_MONTH=0;
          select extract(year from CUR_DATE) into CUR_YEAR FROM DUAL;
          SELECT EXTRACT(MONTH FROM CUR_DATE) INTO CUR_MONTH FROM DUAL;
          IF ((mod(CUR_YEAR, 4)=0 and mod(CUR_YEAR, 100)!= 0) or  (mod(CUR_YEAR, 400) = 0)) then
            FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS_RUNNIAN(CUR_MONTH));
          ELSE 
            FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS(CUR_MONTH));
          END IF;
          CUR_DATE:= ADD_MONTHS(CUR_DATE,1);
          GE_MONTH := GE_MONTH - 1;
        END LOOP;
      end if;
      return(substr(FunctionResult,2));
    end GETMONTHANDDAYS;
    

    结果示例(只需要根据分号截取每一条看是不是你想要的)
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?