22,210
社区成员
发帖
与我相关
我的任务
分享
--要求完成时间
DECLARE @enddate DATETIME='2019-03-16 17:22:00'
DECLARE @seq INT, --工序序号
@process VARCHAR(32), --工序
@cycle DECIMAL(5,1), --工序时间
@span INT, --区间分钟数
@flag BIT --是否分配
--定义一个表来存储时段
DECLARE @t TABLE(StartTime DATETIME NOT NULL, EndTime DATETIME NOT NULL, [Minutes] INT NOT NULL,flag BIT NULL DEFAULT(0),
processStartTime DATETIME NULL, processEndTime DATETIME NULL)
INSERT @t(StartTime, EndTime, [Minutes])
SELECT 开始时间, CASE when 结束时间>@enddate THEN @enddate ELSE 结束时间 END 结束时间,
DATEDIFF(MINUTE,开始时间,CASE when 结束时间>@enddate THEN @enddate ELSE 结束时间 END) 分钟
FROM @b WHERE 结束时间<=@enddate OR @enddate BETWEEN 开始时间 AND 结束时间
ORDER BY 开始时间 DESC
--SELECT * FROM @t
--输出的表
DECLARE @processTime TABLE(process VARCHAR(32) NOT NULL,StartTime datetime NOT NULL,EndTime DATETIME NOT NULL)
DECLARE cur CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
SELECT 序号, 工序, 工序周期*60 AS 周期 FROM @a ORDER BY 序号 DESC
OPEN cur
FETCH NEXT FROM cur INTO @seq,@process,@cycle
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE @t SET @flag = CASE WHEN @cycle>0 THEN 1 ELSE 0 END,
@span = CASE WHEN @cycle<=[Minutes] THEN @cycle ELSE [Minutes] END,--如果工序需要的时间小于时段区间则整个工序完成,否则取时段值
@cycle=@cycle-@span, --还需要分配的时间
[Minutes]=[Minutes]-@span,
flag = @flag,
EndTime = DATEADD(MINUTE,-@span,EndTime),
processStartTime = DATEADD(MINUTE,-@span,EndTime),
processEndTime= EndTime
INSERT @processTime(process, StartTime, EndTime)
SELECT @process, processStartTime, processEndTime FROM @t WHERE flag=1
DELETE FROM @t WHERE [Minutes]=0
FETCH NEXT FROM cur INTO @seq,@process,@cycle
END
CLOSE cur
DEALLOCATE cur
SELECT *,DATEDIFF(MINUTE,StartTime,EndTime) Span FROM @processTime