一列的秒表
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
在我们的组织帮助台中,我们想计算从创建工单时起所花费的时间。我们有许多地点,营业时间设置不同。有些地点将全天候 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