在Massive Varchar字段中存储的EventLog中计算持续时间的最有效方法是什么?

时间:2013-12-01 02:34:14

标签: sql sql-server-2008 substring varchar duration

我们公司将来电呼叫记录到SQL表中VarChar字段中的不同代理。此字段为EventLog

因此,Select EventLog From DB Where CallID = 'Long_String_of_Numbers'会在一个 LONG 行中产生以下内容:

21:02:10: Initializing 21:02:10: Offering 21:02:10: ANI:  5551234567 21:02:10: DNIS:  1032 21:02:10: Call answered 21:02:10: Call from: 5551234567 21:02:12: Offering 21:02:12: Entered Workgroup Clients 21:02:20: ACD - Wait Agent 21:02:20: ACD - Wait Agent 21:02:20: ACD - Wait Agent 21:02:20: ACD call waiting for agent 21:05:47: ACD interaction assigned to arnoldSW 21:05:47: ACD call waiting for agent 21:05:47: ACD - Alerting: arnoldSW 21:05:48: Offering 21:05:48: Sent to user arnoldSW 21:05:48: Alerting 21:05:48: Sent to station WOLF1 21:05:51: Connected 21:05:51: ACD interaction connected to arnoldSW 21:05:51: ACD - Assigned: arnoldSW 21:15:34: Sent to station ABC 21:16:42: Held 21:17:19: Connected 21:17:19: Sent to user northSK 21:20:04: Disconnected [Local Hang Up]

为简单起见,这里的格式化字符串在一行中:

21:02:10: Initializing 
21:02:10: Offering 
21:02:10: ANI:  5551234567 
21:02:10: DNIS:  1032 
21:02:10: Call answered 
21:02:10: Call from: 5551234567 
21:02:12: Offering 
21:02:12: Entered Workgroup Clients 
21:02:20: ACD - Wait Agent 
21:02:20: ACD - Wait Agent 
21:02:20: ACD - Wait Agent 
21:02:20: ACD call waiting for agent 
21:05:47: ACD interaction assigned to arnoldSW 
21:05:47: ACD call waiting for agent 
21:05:47: ACD - Alerting: arnoldSW 
21:05:48: Offering 
21:05:48: Sent to user arnoldSW 
21:05:48: Alerting 
21:05:48: Sent to station WOLF1 
21:05:51: Connected 
21:05:51: ACD interaction connected to arnoldSW 
21:05:51: ACD - Assigned: arnoldSW                 // Duration From HERE ...
21:15:34: Sent to station ABC 
21:16:42: Held 
21:17:19: Connected 
21:17:19: Sent to user northSK 
21:20:04: Disconnected [Local Hang Up]             // ... To Here

ACD - AssignedDisconnected之间计算持续时间的最有效方法是什么? (注意:在这些事件发生之前,之间和之后记录的步​​骤数量各不相同,我需要为至少19,000次呼叫执行此操作。因此,这是构建统计信息的有效方法。)

1 个答案:

答案 0 :(得分:3)

很多问题,比如这个,归结为糟糕的架构。然而,如果你不能改变它,那么你可以做类似于下面的事情。它搜索字段名称,备份适当数量的字符,并将时间转换为实际时间数据类型,以便它可以使用DATEDIFF计算秒数。我在几秒钟之后离开了它,因为你没有指定你想要如何舍入到分钟,但转换成分钟很简单。

DECLARE @test varchar(2048)

SET @test = '21:02:10: Initializing 21:02:10: Offering 21:02:10: ANI:  5551234567 21:02:10: DNIS:  1032 21:02:10: Call answered 21:02:10: Call from: 5551234567 21:02:12: Offering 21:02:12: Entered Workgroup Clients 21:02:20: ACD - Wait Agent 21:02:20: ACD - Wait Agent 21:02:20: ACD - Wait Agent 21:02:20: ACD call waiting for agent 21:05:47: ACD interaction assigned to arnoldSW 21:05:47: ACD call waiting for agent 21:05:47: ACD - Alerting: arnoldSW 21:05:48: Offering 21:05:48: Sent to user arnoldSW 21:05:48: Alerting 21:05:48: Sent to station WOLF1 21:05:51: Connected 21:05:51: ACD interaction connected to arnoldSW 21:05:51: ACD - Assigned: arnoldSW 21:15:34: Sent to station ABC 21:16:42: Held 21:17:19: Connected 21:17:19: Sent to user northSK 21:20:04: Disconnected [Local Hang Up]'

SELECT
    CAST(SUBSTRING(@test, PATINDEX('%ACD - Assigned:%', @test) - 10, 8) AS time) AS AssignedTime,
    CAST(SUBSTRING(@test, PATINDEX('%Disconnected%', @test) - 10, 8) AS time) AS DisconnectTime,
    DATEDIFF(second, 
        CAST(SUBSTRING(@test, PATINDEX('%ACD - Assigned:%', @test) - 10, 8) AS time),
        CAST(SUBSTRING(@test, PATINDEX('%Disconnected%', @test) - 10, 8) AS time)) AS SecondsElapsed