我在SQL表中有以下信息(有其他相关字段,但这些是必需的主要数据)
Name State Time
tst1 Start 2012-06-24 11:51:48.5210000
tst1 Completed 2012-06-24 11:56:48.5210000
tst1 InProgress 2012-06-24 11:53:48.5210000
tst1 Completed 2012-06-24 11:56:48.5210000
tst1 InProgess 2012-06-24 11:53:48.5210000
tst1 Start 2012-06-24 11:51:48.5210000
以上数据仅用于测试和测试。及其相对状态的时间戳。 我需要计算完成一个测试所需的时间来获得开始时间戳和完成时间戳。
以下格式是可选的。但是需要计算一个测试用例所需的时间。如果我们有一个名为&的测试用例时间戳一样,那么它可以被认为是一个。
//可选格式
还需要将一个州的时间转移到另一个州。
像
Name State Timetaken
tst1 start-Completed 5:00
tst1 start-Inprogress 2:00
tst1 Inprogress-Completed 3:00
注意:数据中记录的tst1数据可以是随机的(如上表所示,状态为start,然后完成,然后是Inprogress)
答案 0 :(得分:1)
如果你有相同名称的测试的重叠时间,就像在例子中一样(两次从11:51开始,两次在11:56完成),那么就不可能知道哪个完成对应哪个启动。
SELECT t1.Name
, CASE WHEN t1.State='Start' THEN 'Start-Inprogress'
WHEN t1.State='InProgress' THEN 'Inprogress-Completed'
WHEN t1.State='Completed' THEN 'Start-Completed'
END AS State
, CASE WHEN t1.State='Completed'
THEN right(CONVERT(VARCHAR,(t1.Time-(SELECT max(Time) FROM TableName t2 WHERE t1.Name = t2.Name AND t2.Time < t1.Time AND t2.State='Start')),108),5)
ELSE right(CONVERT(VARCHAR,((SELECT min(Time) FROM TableName t2 WHERE t1.Name = t2.Name AND t2.Time > t1.time AND t2.State!='Start')-t1.Time),108),5)
END AS Timetaken
FROM TableName t1
GROUP BY t1.Name, t1.State, t1.Time
答案 1 :(得分:0)
您可以将带有APPLY运算符和值的选项用作表源
SELECT [state],
CAST(COALESCE(Timetaken, Timetaken2, Timetaken3) AS time) AS Timetaken
FROM (
VALUES('Start-Completed'),
('Start-Inprogress'),
('Inprogress-Completed')
) x([state])
CROSS APPLY (
SELECT TOP 1
MAX(CASE WHEN [state] = 'Completed'
THEN CAST([time] AS datetime) END)
- MAX(CASE WHEN [state] = 'Start'
THEN CAST([time] AS datetime) END) AS Timetaken,
MAX(CASE WHEN [state] = 'InProgress'
THEN CAST([time] AS datetime) END)
- MAX(CASE WHEN [state] = 'Start'
THEN CAST([time] AS datetime) END) AS Timetaken2,
MAX(CASE WHEN [state] = 'Completed'
THEN CAST([time] AS datetime) END)
- MAX(CASE WHEN [state] = 'InProgress'
THEN CAST([time] AS datetime) END) AS Timetaken3
FROM dbo.test133 t
WHERE x.[state] LIKE '%' + t.[state] + '%'
GROUP BY name
) o
结果:
state Timetaken
Start-Completed 00:05:00.0000000
Start-Inprogress 00:02:00.0000000
Inprogress-Completed 00:03:00.0000000
请参阅SQLFiddle
上的演示