求:根据开工日期+工期,跳过节假日,计算完工日期

梁凉凉 2022-07-25 14:37:15

两张表,一张施工计划表,有开工日期和工期;另一张表是节假日表,包含所有节假日,只用Sql查询实现计算完工日期,不用函数

...全文
160 17 打赏 收藏 举报
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复

看demo,思路很重要。

--结果集(有效完工期表)
declare @result table(
    id int identity(1,1) not null,
    attachDt datetime
)


--节假日历表
declare @holidays table (
    id int identity(1,1) not null,
    holiday datetime    
)
insert into @holidays
select '2019-10-1' union all
select '2019-10-2' union all
select '2019-10-3' union all
select '2019-10-4' union all
select '2019-10-5' union all
select '2019-10-6' union all
select '2019-10-7'
-- select * from @holidays
----------------------------------------------------------------------------------------

--传参:开工日期及完工日期
declare @beginDate datetime ='2019-9-27',
        @workDay int = 21

--计算理论上的预计完工日期
declare @endDate datetime
select @endDate = dateadd(dd,@workDay,@beginDate)

--日期范围拆分
insert into @result
select dateadd(day,number,@BeginDate) from master.dbo.spt_values
where type ='p' and number <= datediff(day,@beginDate,@endDate)


--计算出包含的节假日天数
declare @holiday int
select @holiday = count(*) from @result a inner join @holidays b on a.attachDt = b.holiday


--返回准确的预计完工日期(排除节假日后)
select dateadd(dd,@holiday,max(attachDt)) from @result
  • 打赏
  • 举报
回复
@morliz子轩 都decalre工期天数了,直接while 工期&gt;0 循环,if exists (select 1 from 假日表 where 假日日期 = @开工日期+1) begin set 工期 = 工期 -1 end set @开工日期 = @开工日期+1,即逐天累加,判断是否为假日,不为假日则占一天工期,这个思路可行吗
  • 举报
回复
@锟斤拷锟斤拷 通过遍历循环判断每个日期是否为节假日,进行合计非节假日期,这也是条非常好的思路。有工期(天数)可以完全推算出计划完工日期。
  • 举报
回复
猫狸嘎 07-26

img


加15/30/60看着都对,为啥说不对呢

  • 打赏
  • 举报
回复
梁凉凉 07-26
@猫狸嘎 比如:开工日期是2022.7.21,工期是15天。如果统计节假日是开工日期到开工日期+15,这个天数是4天,这样跳过节假日4天,算出来是2022.8.8,算这个工作日差是13天,这个就不对了
  • 举报
回复
猫狸嘎 07-26
@梁凉凉 只看懂开工日期=7.21,工期=15,后面没看懂。不过我确实有错误的地方,应当改成这样完工日期=开工日期+工期-(select count(*) from 节假日表 where 日期 between 开工日期 and 开工日期+工期)
  • 举报
回复
展开其他4条回复
猫狸嘎 07-26

select 完工日期=开工日期+工期-(select count(*) from 节假日表) from 施工计划表;
不要告诉我count都不让用,如果count能用,别的函数为啥不能用呢?

  • 打赏
  • 举报
回复
梁凉凉 07-26
@猫狸嘎 工期长一点,这个算的就不对了,比如15天,60天
  • 举报
回复

用一个日历表(全部日期)和节假日表连接,减掉节假日日期作为你的主表,然后对日期排序 row_number,从开工日期算起往后推,序号等于工期的就是完工日期。

  • 打赏
  • 举报
回复
梁凉凉 07-26
@lhzlhk 怎么生成日历表呢?
  • 举报
回复
梁凉凉 07-26
@lhzlhk 这样生成日历表再关联施工计划表,数据是不是太多了?
  • 举报
回复
展开其他2条回复
发帖
MS-SQL Server

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
帖子事件
创建了帖子
2022-07-25 14:37
社区公告
暂无公告