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

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

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

...全文
781 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
morliz子轩 2022-08-02
  • 打赏
  • 举报
回复

看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
锟斤拷锟斤拷 2022-08-02
  • 举报
回复
@morliz子轩 都decalre工期天数了,直接while 工期&gt;0 循环,if exists (select 1 from 假日表 where 假日日期 = @开工日期+1) begin set 工期 = 工期 -1 end set @开工日期 = @开工日期+1,即逐天累加,判断是否为假日,不为假日则占一天工期,这个思路可行吗
morliz子轩 2022-08-03
  • 举报
回复
@锟斤拷锟斤拷 通过遍历循环判断每个日期是否为节假日,进行合计非节假日期,这也是条非常好的思路。有工期(天数)可以完全推算出计划完工日期。
猫狸嘎 2022-07-26
  • 打赏
  • 举报
回复

img


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

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

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

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

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

梁凉凉 2022-07-26
  • 举报
回复
@幸福感奇差 怎么生成日历表呢?
梁凉凉 2022-07-26
  • 举报
回复
@幸福感奇差 这样生成日历表再关联施工计划表,数据是不是太多了?
幸福感奇差 2022-07-28
  • 举报
回复
@梁凉凉 比如说你有一个序号表,里面记录的 range(1, 1000),然后用某个起始日期加上这个序号就自动做成一个日历表了。
1条回复

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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