求教各位大侠,oracle数据库中求某个日期后的第N个工作日是哪天。

假设我给定的日期是2012年9月28日,求它20个工作日之后是哪天,sql查询怎么写,还是用游标?忘给出详细的解答,不胜感激

思路:20个工作日是4个周的工作日 加上4*2个休息日 20+4*2一共是28天,将2012-9-29日之后的28天列出来,查找第20个工作日
关于计算这个28其实没有必要,因为这是最小范围,取任意大于28的范围都可以

select * from
(
with x as (
select trunc(to_date('2012-9-28','yyyy-mm-dd')+level,'dd') +level-1 day ,to_char(to_date('2012-9-28','yyyy-mm-dd')+level,'dy') weekday from dual
connect by level <= 28
)select rownum id,x.* from x where weekday not in ('星期六','星期日')

)y where id = 20
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-10
select * from all_date
where all_date_year>=2012 and all_date_month>=9 and all_date_day>=28 --往后查找
and day_is_work=1 --限定工作日
and rownum=20 --刚好是第20个工作日
order by all_date_year,all_date_month,all_date_day

大概是这样的吧 你调试看下对不对追问

这样肯定不对的,2013年大于9的月份岂不是全没了。我感觉用游标或存储过程比较好。只是我写不对了

追答

那你就把年月日拼接成字符串 然后再转为日期型 然后再过滤就是了

我觉得你的表结构设计不合理 为什么不放一个日期上去呢?这样做比较筛选不好么。

本回答被网友采纳
第2个回答  2013-01-10
select * from all_date
where all_date_year>=2012 and all_date_month>=9 and all_date_day>=28 --你给定的日期
and day_is_work=1 --限定工作日
and rownum=20 --刚好是第20个工作日
order by all_date_year,all_date_month,all_date_day追问

哥,不要抄写下边的

第3个回答  2013-01-10
这种表结构还真是新颖给你一点思路吧 没有实践过哟
首先定位到2012-09-28这条数据 然后 从这条开始 向下找20条 并过滤 is_work=0的数据
我的想法就是把2012-09-28以后的数据放到一个临时表中,然后根据排序顺序 top出来所需要数据的条数
第4个回答  2013-01-10
如果你操作的列是日期类型直接相加