如果您有 TABLE 或 HTML 代码,从您的描述中不清楚!您谈论的是表格,但呈现的是 HTML 代码。
如果您有一个表,那么我们需要获取一个表,这意味着查询以创建表并插入示例数据。如果您有需要解析的 HTML 代码,那么您没有表格,只有文本。
假设您有问题中提供的 HTML 代码,那么您有一个 XML 代码,这意味着您可以使用函数 OPENXML 来解析来自此处提供的 HTML 代码的数据:
DECLARE @HTML as XML
SELECT @HTML = '
<table>
<thead>
<tr>
<th>TicketNumber</th>
<th>duration</th>
</tr>
</thead>
<tbody>
<tr>
<td>521163</td>
<td>44:08:11</td>
</tr>
</tbody>
<tbody>
<tr>
<td>906868</td>
<td>404:55:27</td>
</tr>
</tbody>
<tbody>
<tr>
<td>140013</td>
<td>412:08:03</td>
</tr>
</tbody>
</table>
'
SELECT @HTML
------------------ First we will learn how to parse the HTML data to get table structure
-- Note! This base on exact format of the HTML code!
-- Any change in the format will fail this solution
DECLARE @handle INT
DECLARE @PrepareXmlStatus INT
EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @HTML
SELECT id, MyTime
FROM OPENXML(@handle, '/table/tbody/tr', 1)
WITH (
id NVARCHAR(MAX) '(td)[1]',
MyTime NVARCHAR(MAX) '(td)[2]'
)
EXEC sp_xml_removedocument @handle
使用这种方法,我们现在可以使用上述查询的结果 SET 中的数据并计算时间的总和,如下所示(这应该是您的解决方案):
DECLARE @HTML as XML
SELECT @HTML = '
<table>
<thead>
<tr>
<th>TicketNumber</th>
<th>duration</th>
</tr>
</thead>
<tbody>
<tr>
<td>521163</td>
<td>44:08:11</td>
</tr>
</tbody>
<tbody>
<tr>
<td>906868</td>
<td>404:55:27</td>
</tr>
</tbody>
<tbody>
<tr>
<td>140013</td>
<td>412:08:03</td>
</tr>
</tbody>
</table>
'
DECLARE @handle INT
DECLARE @PrepareXmlStatus INT
EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @HTML
---------------- Now we can use the above way of parsiong the HTML in order to calculate the SUM of the times
EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @HTML
;With MyCTE as (
SELECT id, MyTime
FROM OPENXML(@handle, '/table/tbody/tr', 1)
WITH (
id NVARCHAR(MAX) '(td)[1]',
MyTime NVARCHAR(MAX) '(td)[2]'
)
),
-- Convert Seconds, minutes, hours to INT and sum
MyCTE1 as(
SELECT
MySec = SUM(CONVERT(INT,PARSENAME(REPLACE(MyTime,':','.'),1))),
MyMin = SUM(CONVERT(INT,PARSENAME(REPLACE(MyTime,':','.'),2))),
MyHour = SUM(CONVERT(INT,PARSENAME(REPLACE(MyTime,':','.'),3)))
from MyCTE
),
-- Move from seconds to minutes and from minutes to hours if the value above 60
MyCTE2 as(
SELECT
MySec = (MySec%60),
MyMin = (MyMin + (MySec/60)) % 60,
MyHour = MyHour + ((MyMin + (MySec/60)) / 60)
from MyCTE1
)
SELECT
CONVERT(VARCHAR(10), MyHour) + ':' +
RIGHT('00' + CONVERT(VARCHAR(2), MyMin),2) + ':' +
RIGHT('00' + CONVERT(VARCHAR(2), MySec),2)
FROM MyCTE2
EXEC sp_xml_removedocument @handle
使用现有表
如果您已经有一个表格(不是 HTML 代码)并且您只需要查找天数、小时数、分钟数、秒数,那么您只需要使用上述查询的结尾部分即可。我们不需要解析 HTML 代码,因此我们可以跳转到名为 MyCTE01 的 CTE。
例如,使用评论中提供的 op DDL+DML:
CREATE TABLE [dbo].[OpenTickets] ( [TicketNumber] [varchar](50) NULL ,[Duration] [varchar](20) NULL )
GO
INSERT INTO [dbo].[OpenTickets] VALUES
( 521163 ,'44:08:11' ) ,( 746008 ,'45:38:35' ) ,( 120025 ,'48:50:31' ) ,( 780125 ,'75:15:59' ) ,( 903960 ,'76:23:49' ) ,
( 937883 ,'178:20:27' ) ,( 524404 ,'80:16:08' ) ,( 374972 ,'81:17:28' )
GO
SELECT * FROM [OpenTickets]
GO
;With MyCTE1 as(
SELECT
MySec = SUM(CONVERT(INT,PARSENAME(REPLACE([Duration],':','.'),1))),
MyMin = SUM(CONVERT(INT,PARSENAME(REPLACE([Duration],':','.'),2))),
MyHour = SUM(CONVERT(INT,PARSENAME(REPLACE([Duration],':','.'),3)))
from [OpenTickets]
),
-- Move from seconds to minutes and from minutes to hours if the value above 60
MyCTE2 as(
SELECT
MySec = (MySec%60),
MyMin = (MyMin + (MySec/60)) % 60,
MyHour = MyHour + ((MyMin + (MySec/60)) / 60)
from MyCTE1
)
SELECT
MyDays = MyHour/24,
Total = 'Days: ' + CONVERT(VARCHAR(10), MyHour/24) + ' and ' +
CONVERT(VARCHAR(10), MyHour % 24) + ':' +
RIGHT('00' + CONVERT(VARCHAR(2), MyMin),2) + ':' +
RIGHT('00' + CONVERT(VARCHAR(2), MySec),2),
TotalTime = CONVERT(VARCHAR(10), MyHour) + ':' +
RIGHT('00' + CONVERT(VARCHAR(2), MyMin),2) + ':' +
RIGHT('00' + CONVERT(VARCHAR(2), MySec),2)
FROM MyCTE2
GO