sql - 查找在某项任务上工作的营业时间数
问题描述
我正在寻找计算在特定任务上工作的实际小时数。时钟一旦应用标签(activity_tag='Add_Tag')就开始。当进度='阻塞'时时钟停止,当进度='进行中'时它再次开始。任务可以有任意数量的状态变化。所以我很困惑从哪里开始,如何排除“阻塞”时间等。任何指针都会非常有帮助。
这是一些示例数据。
非常感谢你的帮助!!!
解决方案
您可以编写一个光标并在那里编写业务逻辑来计算特定任务编号的总小时数。您可以根据您的要求更改此设置。
它检查活动和进度的先前值,并在此基础上决定是否考虑 CreateTime 的差异。
SET NOCOUNT ON;
DECLARE @Activity varchar(50);
declare @Progress varchar(50);
declare @CreateTime datetime;
DECLARE c_task CURSOR FOR SELECT Activity, Progress, CreateTime FROM TaskTable where TaskNumber=123;
declare @totalMinutes int;
declare @lastTime datetime;
declare @lastActivity varchar(50);
declare @lastProgress varchar(50);
SET @totalMinutes=0;
SET @lastTime = getdate();
set @lastActivity = '';
set @lastProgress = '';
OPEN c_task;
FETCH next from c_task into @Activity, @Progress, @CreateTime
WHILE @@FETCH_STATUS = 0
Begin
if((@Activity = 'Add_Tag' or @Progress='In Progress') and (@lastActivity!='Add_Tag'))
Begin
set @lastActivity = @Activity;
set @lastProgress = @Progress;
set @lastTime = @CreateTime;
End
Else if((@Progress='Blocked' or @Progress='Closed') and (@lastActivity = 'Add_Tag' or @lastProgress='In Progress'))
Begin
print @lastActivity;
print @lastProgress;
print @lastTime;
set @lastActivity = @Activity;
set @lastProgress = @Progress;
set @totalMinutes += datediff(minute, @lastTime, @CreateTime);
print @totalMinutes;
End
FETCH next from c_task into @Activity, @Progress, @CreateTime
END;
CLOSE c_task;
DEALLOCATE c_task;
select @totalMinutes/60;