当前位置: 代码迷 >> Sql Server >> sql 查询n 个工作日后的日期解决办法
  详细解决方案

sql 查询n 个工作日后的日期解决办法

热度:42   发布时间:2016-04-24 19:12:18.0
sql 查询n 个工作日后的日期
数据库是用sql2000 
有张表a
结构如下:
a_date          a_day     
2013-11-11       3
2013-11-19       3
2013-11-13       5
2013-11-15       1

a_date 是登记日期 a_day 是多少工作日 
我要查询到多少个工作日后的日期,要去除星期六和星期日
效果如下:

a_date          a_day      结果 
2013-11-11       3       2013-11-14
2013-11-19       3       2013-11-22
2013-11-13       5       2013-11-20
2013-11-15       1       2013-11-15

------解决方案--------------------

create table #tb(a_date datetime,a_day int)
insert into #tb    
select '2013-11-11',3
union all select '2013-11-19',3
union all select '2013-11-13',5
union all select '2013-11-15',1

select a.*,endworkday=DATEADD(day,a.a_day+b.num,a.a_date)
from #tb a
inner join 
(select a_date,sum(case when DATEPART(WEEKDAY,lastdate) IN(1,7) then 1 else 0 end) as num
from 
(select *,lastdate=DATEADD(DAY,b.number,a_date)
from #tb a,master..spt_values b
where b.type='P' and b.number between 1 and a.a_day
)t
group by a_date
)b on a.a_date=b.a_date


/*
a_date a_day endworkday
-----------------------------------------------------
2013-11-11 00:00:00.000 3 2013-11-14 00:00:00.000
2013-11-19 00:00:00.000 3 2013-11-22 00:00:00.000
2013-11-13 00:00:00.000 5 2013-11-20 00:00:00.000
2013-11-15 00:00:00.000 1 2013-11-17 00:00:00.000
*/



你的答案有问题吧?2013-11-15是周五,一天之后应该是下周一了,所以应该是2013-11-17,没错吧? 


------解决方案--------------------
除去周六周日还有法定假日, 如果你要连那个也算进去的话, 估计你得先定义一个法定假日表,然后再操作
------解决方案--------------------
引用:
数据库是用sql2000 
有张表a
结构如下:
a_date          a_day     
2013-11-11       3
2013-11-19       3
2013-11-13       5
2013-11-15       1

a_date 是登记日期 a_day 是多少工作日 
我要查询到多少个工作日后的日期,要去除星期六和星期日
效果如下:

a_date          a_day      结果 
2013-11-11       3       2013-11-14
2013-11-19       3       2013-11-22
2013-11-13       5       2013-11-20
2013-11-15       1       2013-11-15



楼主试试这个 

create table #tb(a_date datetime,a_day int)
insert into #tb    
select '2013-11-11',3
union all select '2013-11-19',3
union all select '2013-11-13',5
union all select '2013-11-15',1


 ---

select *,case when datepart(dw, dateadd(day, a_day,a_date))=7 then  dateadd(day, a_day,a_date+2)  
              when  datepart(dw, dateadd(day, a_day,a_date))=1 then  dateadd(day, a_day,a_date+1)
         else   dateadd(day, a_day,a_date) end 
from #tb
  相关解决方案