首页 > 解决方案 > 查找在某项任务上工作的营业时间数

问题描述

我正在寻找计算在特定任务上工作的实际小时数。时钟一旦应用标签(activity_tag='Add_Tag')就开始。当进度='阻塞'时时钟停止,当进度='进行中'时它再次开始。任务可以有任意数量的状态变化。所以我很困惑从哪里开始,如何排除“阻塞”时间等。任何指针都会非常有帮助。

这是一些示例数据。

在此处输入图像描述

非常感谢你的帮助!!!

标签: sql

解决方案


您可以编写一个光标并在那里编写业务逻辑来计算特定任务编号的总小时数。您可以根据您的要求更改此设置。

它检查活动和进度的先前值,并在此基础上决定是否考虑 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;

推荐阅读