sql sever 数据更新问题

sql sever当中有一组数据,如下图,如何让状态位正在执行的数据中最晚的计划完工时间的值更新为第一条状态为等待执行的数据的开工时间,然后通过公式 DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)算出完工时间,然后将剩余的等待执行的数据进行逻辑处理,处理逻辑为,按序号顺序将第一条的计划完工时间更新为下一条的计划开工时间,在用公式 DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)计算出计划完工时间,赋值给下下一条。以此类推

img

【以下回答由 GPT 生成】

解决方案

根据问题描述,可以采用以下步骤来实现给定的逻辑:

  1. 更新状态为"正在执行"的数据中最晚的计划完工时间的值为状态为"等待执行"的第一条数据的开工时间。
  2. 使用公式 DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间) 计算更新后的完工时间。
  3. 循环处理剩余的状态为"等待执行"的数据,按照序号顺序进行逻辑处理:
  4. 更新每一条数据的计划完工时间为下一条数据的计划开工时间。
  5. 使用公式 DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间) 计算更新后的计划完工时间。
  6. 将更新后的计划完工时间赋值给下下一条数据。

具体的SQL语句实现如下:

-- 更新状态为"正在执行"的数据中最晚的计划完工时间的值为状态为"等待执行"的第一条数据的开工时间
UPDATE YourTable
SET 计划完工时间 = (SELECT 开工时间 FROM YourTable WHERE 状态 = '等待执行' ORDER BY 开工时间 ASC LIMIT 1)
WHERE 状态 = '正在执行'
AND 计划完工时间 = (SELECT MAX(计划完工时间) FROM YourTable WHERE 状态 = '正在执行')

-- 使用公式计算更新后的完工时间
UPDATE YourTable
SET 完工时间 = DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)

-- 循环处理剩余的状态为"等待执行"的数据
DECLARE @NextPlanStartTime DATETIME
DECLARE @NextPlanFinishTime DATETIME
DECLARE @NextNextPlanFinishTime DATETIME

-- 获取第一条数据
SELECT TOP 1 @NextPlanStartTime = 计划开工时间, @NextNextPlanFinishTime = 计划完工时间
FROM YourTable
WHERE 状态 = '等待执行'
ORDER BY 序号

-- 循环处理剩余数据
WHILE EXISTS(SELECT 1 FROM YourTable WHERE 状态 = '等待执行')
BEGIN
  -- 更新计划完工时间为下一条数据的计划开工时间
  UPDATE YourTable
  SET 计划完工时间 = @NextPlanStartTime
  WHERE 序号 = (SELECT TOP 1 序号 FROM YourTable WHERE 状态 = '等待执行' ORDER BY 序号 ASC)

  -- 使用公式计算更新后的计划完工时间
  UPDATE YourTable
  SET 计划完工时间 = DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)

  -- 更新计划完工时间赋值给下下一条数据
  SELECT TOP 1 @NextPlanStartTime = 计划开工时间, @NextNextPlanFinishTime = 计划完工时间
  FROM YourTable
  WHERE 状态 = '等待执行' AND 计划完工时间 > @NextPlanStartTime
  ORDER BY 序号
END

上述SQL语句将按照问题描述的逻辑,逐步更新数据。请将代码中的 YourTable 替换为实际表名,并将 数量小时产能状态计划开工时间计划完工时间完工时间开工时间序号 替换为实际的字段名。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^