1.2017-01-05至2018-04-05 希望返回 每个月有几天,可以用一个函数或者存储过程来实现
2.因为有大量的数据需要处理,所以返回值需要有对应,也就是说输入(id,起始日期,结束日期) 就可以返回对应的id 每个月的天数: id 月份 天数
获取oracle两个时间断的月份与天数
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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;
结果示例(只需要根据分号截取每一条看是不是你想要的)
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥60 版本过低apk如何修改可以兼容新的安卓系统
- ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
- ¥50 有数据,怎么建立模型求影响全要素生产率的因素
- ¥50 有数据,怎么用matlab求全要素生产率
- ¥15 TI的insta-spin例程
- ¥15 完成下列问题完成下列问题
- ¥15 C#算法问题, 不知道怎么处理这个数据的转换
- ¥15 YoloV5 第三方库的版本对照问题
- ¥15 请完成下列相关问题!
- ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?