在线等!!!oracle 数据库一个查询问题!

小刘哈哈 2014-08-25 10:28:57
求教、oracle 数据库中有两个时间段 开始和结束时间 比如 开始:2014-08 结束 2015-08 我现在要根据这2个时间 生成12条记录 每月一条 ,在线等大神!
...全文
127 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小刘哈哈 2014-08-26
  • 打赏
  • 举报
回复
谢谢亲 我已经弄好了!我的做法是 :
WITH TMP_DAY AS (SELECT TO_CHAR(ADD_MONTHS(TO_DATE(to_char(sysdate - interval '3' year,'yyyy-MM'),'yyyy-MM'),
                                                     ROWNUM),
                                          'yyyy-MM') PAYMENTTIME
                             FROM DUAL
                           CONNECT BY ROWNUM <= 36)
这个产生月份 sysdate - interval '3' year 这个的意思是当前系统时间扣除3年 <= 36 是循36个月 3年 然后左连接:
SELECT '固定资产' as ITEM,
       C.STATUS,
       C.dept_id as REIM_TARGET_DEPT,
       C.target_id as REIM_TARGET_ID,
       C.target_type as REIM_TARGET,
       A.PAYMENTTIME,
       C.monthamount as AMOUNT,
       C.creatuser as createuser,
       C.creattime as createtime,
       uus.realname
  FROM TMP_DAY A
  LEFT JOIN zy_fix_asset C ON 1 = 1
  LEFT JOIN zy_users uus on C.creatuser = uus.id where to_date(A.PAYMENTTIME,'yyyy-MM') between to_date(to_char(c.startmonth,'yyyy-MM'),'yyyy-MM') and to_date(to_char(c.endmonth,'yyyy-MM'),'yyyy-MM');
这样构造数据表 就可以了
sy401042879 2014-08-25
  • 打赏
  • 举报
回复
引用 2 楼 liuxum 的回复:
类似这种 select 年月=开始时间年月 from 表 where 年月>=开始时间 and 年月<=结束时间 union select 年月=开始时间年月+1月 from 表 where 年月>=开始时间 and 年月<=结束时间 union select 年月=开始时间年月+2月 from 表 where 年月>=开始时间 and 年月<=结束时间 。。。。。。。。。 union select 年月=开始时间年月+12月 from 表 where 年月>=开始时间 and 年月<=结束时间
union 12下有点多。 可以新建一个月份表。然后 月份表left你的数据表即可。
liuxum 2014-08-25
  • 打赏
  • 举报
回复
类似这种 select 年月=开始时间年月 from 表 where 年月>=开始时间 and 年月<=结束时间 union select 年月=开始时间年月+1月 from 表 where 年月>=开始时间 and 年月<=结束时间 union select 年月=开始时间年月+2月 from 表 where 年月>=开始时间 and 年月<=结束时间 。。。。。。。。。 union select 年月=开始时间年月+12月 from 表 where 年月>=开始时间 and 年月<=结束时间
liuxum 2014-08-25
  • 打赏
  • 举报
回复
用union做联合,每个月一条,逐月增加,最后把结果union
zhk383501372 2014-08-25
  • 打赏
  • 举报
回复
一起学习下 创建触发器: create or replace trigger biufer_tbmeetmgr_CHANGETIME before insert or update or delete of CHANGETIME on tbmeetmgr for each row begin -- 调用存储过程 hzwmeetmgr; end; 存储过程: CREATE OR REPLACE PROCEDURE hzwmeetMgr is meetId number; --会议室编号 strSta varchar2(30); --会议开始时间 strEnd varchar2(30); --会议结束时间 strCreate varchar2(30); --会议创建日期 strOver varchar2(30); --会议终止日期(循环终止时期) strOverSql varchar2(30); --存入临时表中的终止日期 varInt number; --会议创建日期到终止日期相差天数 varSubTime varchar2(30); --循环日期 varMonths number; TYPE c_time IS REF CURSOR; --创建游离标记 vrec c_time; yearY varchar2(10); --日期年部分 monthsM varchar2(10);--日期月部分(终止入库时间) begin delete tbmeetmgrinfo where 11=1 ; --先清空表中数据 commit; varInt := 0; --一次性会议记录 for varCode in (select id ,huiyishi,STARTTIME,ENDTIME,CREATETIME,STOPTIME,xunhuairiqi from tbmeetmgr where HUIYIMOSHI = 1 and to_date(stoptime,'yyyy-MM-dd') >= to_date(to_char(sysdate,'yyyy-MM-dd'),'yyyy-MM-dd')) loop strOver := varCode.Stoptime; strCreate := substr(varCode.Createtime,1,10); meetId := varCode.Huiyishi; strSta := varCode.Starttime; strEnd := varCode.Endtime; varSubTime := substr(varCode.Xunhuairiqi,3); --最后的0代表的是一次性会议、循环模式1为单周、3为每月、4为每季度 insert into tbmeetmgrinfo values(tbmeetmgrinfo_tb_sequence.nextval,meetId,strSta,strEnd,strCreate,strOver,0); commit; end loop; --单周循环 for varCode in (select id ,huiyishi,STARTTIME,ENDTIME,CREATETIME,STOPTIME,xunhuairiqi,(( to_date(stoptime,'yyyy-mm-dd') - next_day (to_date(substr(createtime, 0, 10),'yyyy-mm-dd')-1,3))/7) resultNum from tbmeetmgr where xunhuaimoshi = 1 and to_date(stoptime,'yyyy-MM-dd') >= to_date(to_char(sysdate,'yyyy-MM-dd'),'yyyy-MM-dd')) loop varInt := ceil(varCode.Resultnum); strOver := varCode.Stoptime; strCreate := substr(varCode.Createtime,1,10); meetId := varCode.Huiyishi; strSta := varCode.Starttime; strEnd := varCode.Endtime; varSubTime := substr(varCode.Xunhuairiqi,3); OPEN vrec for SELECT to_char(next_day(to_date(strCreate,'yyyy-mm-dd')-1,ceil(varSubTime)+1)+(rownum-1)*7 , 'yyyy-MM-dd') from dual connect by rownum<=varInt ; LOOP FETCH vrec INTO strOverSql; --入库终止日期 exit when vrec%notfound; --dbms_output.put_line('----+++++单周循环日期++++++-----:'||strOverSql); insert into tbmeetmgrinfo values(tbmeetmgrinfo_tb_sequence.nextval,meetId,strSta,strEnd,strCreate,strOverSql,1); commit; end loop; end loop; --每月循环 for varCodeMonths in(select id ,huiyishi,STARTTIME,ENDTIME,CREATETIME,STOPTIME, Xunhuairiqi,ceil(months_between(to_date(stoptime,'yyyy-mm-dd'), to_date(substr(createtime, 0, 10),'yyyy-mm-dd'))) months from tbmeetmgr where xunhuaimoshi = 3 and to_date(stoptime,'yyyy-MM-dd') >= to_date(to_char(sysdate,'yyyy-MM-dd'),'yyyy-MM-dd')) loop strOver := varCodeMonths.Stoptime; strCreate := substr(varCodeMonths.Createtime,1,10); meetId := varCodeMonths.Huiyishi; strSta := varCodeMonths.Starttime; strEnd := varCodeMonths.Endtime; varMonths := varCodeMonths.Months; varSubTime := substr(varCodeMonths.Xunhuairiqi,3,4); --取得开会时间(具体哪一日) yearY := substr(strCreate,1,8); monthsM := yearY||varSubTime ; OPEN vrec for SELECT to_char(add_months(to_date(monthsM,'yyyy-MM-dd'),+(rownum-1)), 'yyyy-mm-dd') from dual connect by rownum<= ceil(varMonths) ; LOOP FETCH vrec INTO strOverSql; --入库终止日期 exit when vrec%notfound; --dbms_output.put_line('月度时间:'||strOverSql); insert into tbmeetmgrinfo values(tbmeetmgrinfo_tb_sequence.nextval,meetId,strSta,strEnd,strCreate,strOverSql,3); commit; end loop; end loop; --每季度循环 for varCodeMonths in(select id ,huiyishi,STARTTIME,ENDTIME,CREATETIME,STOPTIME, Xunhuairiqi,ceil((to_date(stoptime,'yyyy-mm-dd')-to_date(substr(createtime, 0, 10),'yyyy-mm-dd'))/90) months from tbmeetmgr where xunhuaimoshi = 4 and to_date(stoptime,'yyyy-MM-dd') >= to_date(to_char(sysdate,'yyyy-MM-dd'),'yyyy-MM-dd')) loop strOver := varCodeMonths.Stoptime; strCreate := substr(varCodeMonths.Createtime,1,10); meetId := varCodeMonths.Huiyishi; strSta := varCodeMonths.Starttime; strEnd := varCodeMonths.Endtime; varMonths := varCodeMonths.Months; varSubTime := substr(varCodeMonths.Xunhuairiqi,3,7); --取得开会时间(具体哪一日) yearY := substr(strCreate,1,5); monthsM := yearY||varSubTime ; OPEN vrec for SELECT to_char(add_months(to_date(monthsM,'yyyy-MM-dd'),+(rownum-1)*3), 'yyyy-mm-dd') from dual connect by rownum<= ceil(varMonths) ; LOOP FETCH vrec INTO strOverSql; --入库终止日期 exit when vrec%notfound; --dbms_output.put_line('季度循环日期:'||strOverSql); insert into tbmeetmgrinfo values(tbmeetmgrinfo_tb_sequence.nextval,meetId,strSta,strEnd,strCreate,strOverSql,4); commit; end loop; end loop; end;
Rajesh_James 2014-08-25
  • 打赏
  • 举报
回复
l o o p
小刘哈哈 2014-08-25
  • 打赏
  • 举报
回复
引用 5 楼 liuxum 的回复:
[quote=引用 4 楼 xinglang123 的回复:] 123楼的做法 行不通 我这里的起始和结束时间不一定就只用一年 是可变化的 等 急啊
那你写个存储过程,对开始日期和结束日期做循环,一个月做一条记录呗。月份累加就可以了。[/quote]怎么写 ?
liuxum 2014-08-25
  • 打赏
  • 举报
回复
引用 4 楼 xinglang123 的回复:
123楼的做法 行不通 我这里的起始和结束时间不一定就只用一年 是可变化的 等 急啊
那你写个存储过程,对开始日期和结束日期做循环,一个月做一条记录呗。月份累加就可以了。
小刘哈哈 2014-08-25
  • 打赏
  • 举报
回复
123楼的做法 行不通 我这里的起始和结束时间不一定就只用一年 是可变化的 等 急啊

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧