sql sever当中有一组数据,如下图,如何让状态位正在执行的数据中最晚的计划完工时间的值更新为第一条状态为等待执行的数据的开工时间,然后通过公式 DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)算出完工时间,然后将剩余的等待执行的数据进行逻辑处理,处理逻辑为,按序号顺序将第一条的计划完工时间更新为下一条的计划开工时间,在用公式 DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)计算出计划完工时间,赋值给下下一条。以此类推
【以下回答由 GPT 生成】
根据问题描述,可以采用以下步骤来实现给定的逻辑:
DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)
计算更新后的完工时间。DATEADD(MINUTE, ROUND(ROUND( 数量 / 小时产能 ,2)*60, 0), 计划开工时间)
计算更新后的计划完工时间。具体的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
替换为实际表名,并将 数量
、小时产能
、状态
、计划开工时间
、计划完工时间
、完工时间
、开工时间
、序号
替换为实际的字段名。