一列的秒表

STOPWATCH for a column

在我们的组织帮助台中,我们想计算从创建工单时起所花费的时间。我们有许多地点,营业时间设置不同。有些地点将全天候 24x7 工作,有些地点将从上午 9 点工作到下午 5 点。每天早上,我都需要 运行 查询以获取超过 8 小时的票证并对其执行一些操作。 SQL 服务器或任何其他选项中是否有秒表列,年龄会自动以分钟为单位递增,以便无论何时查询,我们都可以获得自创建以来的确切年龄。

例如,如果位置是分支机构并且在 2020/07/10 15:00 PM 创建了工单,并且如果在 t 2020/07/11 09:00 AM 执行查询,按营业时间(上午 9 点至下午 5 点)计算的年龄为 2 小时。如果工单的位置是总部,则营业时间为 24x7,工单的营业时间为 18 小时。

添加了 3 个列来处理此信息..

IS_TIMER_RUNNING:正确 | false true:在营业时间内(上午 9 点 - 下午 5 点)。 false:非营业时间(下午 5 点 - 上午 9 点)。 TIMER_RUNNING_TIME : 日期时间 TICKET_AGE:时间以秒为单位

使用上午 9 点的作业,IS_TIMER_RUNNING 将设置为 true。在下午 5 点的作业中,IS_TIMER_RUNNING 将设置为 false,并且 TICKET_AGE 将填充时间(以秒为单位)直到该时间结束。

我尝试了以下给出预期查询的查询。

SELECT 
  TICKETID, 
  CONVERT(
    VARCHAR, 
    DATEADD(
      s, 
      CASE WHEN IS_TIMER_RUNNING = '1' THEN datediff(
        s, 
        dateadd(
          s, 
          (wo.TIMER_RUNNING_TIME / 1000), 
          '1970-01-01 00:00:00'
        ), 
        GETUTCDATE()
      ) + TICKET_AGE ELSE TICKET_AGE END, 
      '1900/01/01'
    ), 
    108
  ) 
FROM 
  TICKET

如果有其他更好的选择,请提出建议

您可以创建一个 table 并考虑所有工作时间(包括周末、节假日和不同的工作时间表)。 之后,您将此 table 与工作时间一起添加到您的工单中(考虑到适用的时间表),然后使用 DATEDIFF 计算经过的时间。

例如创建“营业时间 table”

SET DATEFIRST 1;

WITH CTE
AS
(
SELECT cast('2020-01-01' as datetime) as theDate
UNION ALL
SELECT dateadd(day,1,theDate)
FROM CTE
WHERE theDate<='2020-12-31'
)
SELECT 1 as BusinessHoursId,DateAdd(hh,9,theDate) as SOB,DATEADD(hh,17,theDate) as EOB
into Businesshours
FROM CTE
WHERE DATEPART(DW,theDate) between 1 and 5
option (maxrecursion 0)

然后您可以在联接中使用此 table:

SELECT TicketId,
       SUM(DATEDIFF(n,
               CASE WHEN t.Created > bh.SOB THEN t.Created ELSE bh.SOB END ,
               CASE WHEN t.Closed < bh.EOB THEN t.Closed ELSE bh.EOB END
               )
          )
         
FROM Tickets t
JOIN Businesshours bh
ON t.Created < bh.EOB
AND t.Closed > bh.SOB
GROUP BY TicketId