使用自动编号更新列:基于非连续工作日历计算任务完成日期
非连续工作日历下的任务完成日期计算方案
嘿,我来帮你搞定这个任务完成日期的计算问题!先理清楚咱们的核心需求:根据T2里的非连续工作日历,从指定的起始日期(6/1/2018)开始,给T1里的每个人数出对应剩余天数的工作日,把那个日期更新到他们的Complete字段里。
先明确数据情况
- T1表:存储人员任务信息,字段包括
Name(姓名)、DaysRemaining(剩余任务天数)、Complete(待更新的完成日期)- T2表:存储有效工作日,字段是
Date(工作日日期),你提到的Count字段如果没有预设序号的话,咱们可以自己生成
核心思路
咱们需要先给T2里的工作日按从起始日期开始的先后顺序分配序号,然后每个人的剩余天数就对应这个序号值,找到对应的日期后更新T1即可。比如Joe剩余3天,就找序号为3的工作日,也就是6/10/2018,正好符合你的预期。
具体实现(以SQL为例)
第一步:给工作日生成顺序序号
先用CTE给T2的工作日按日期升序生成序号,确保从咱们指定的起始日期(6/1/2018)开始计数:
WITH RankedWorkdays AS ( SELECT Date, ROW_NUMBER() OVER (ORDER BY Date) AS DayRank FROM T2 WHERE Date >= '2018-06-01' -- 限定从今日(6/1/2018)开始的工作日 )
执行这段后,T2里的日期会被标记为:
- 6/1/2018 → DayRank=1
- 6/8/2018 → DayRank=2
- 6/10/2018 → DayRank=3
- 6/15/2018 → DayRank=4
第二步:更新T1的完成日期
把T1里每个人的DaysRemaining和上面生成的DayRank关联,找到对应日期并更新:
UPDATE T1 SET Complete = ( SELECT Date FROM RankedWorkdays WHERE DayRank = T1.DaysRemaining ) WHERE EXISTS ( SELECT 1 FROM RankedWorkdays WHERE DayRank = T1.DaysRemaining );
这段语句会:
- 给Joe更新
Complete为6/10/2018(对应DayRank=3) - 给Mary更新
Complete为6/8/2018(对应DayRank=2) - 同时用
EXISTS过滤掉剩余天数超过可用工作日数量的记录,避免把Complete更新为NULL(如果有这种情况,你可以根据需求调整,比如用最后一个工作日填充或者抛出提示)
补充说明
如果T2里的Count字段本来就是按顺序预设好的序号,那可以直接用Count代替咱们生成的DayRank,不用再用ROW_NUMBER()啦。
内容的提问来源于stack exchange,提问作者farmpapa
相关产品推荐
相关产品推荐

