根据测试用例的状态计算时间

时间:2013-06-26 09:44:19

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我在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)

2 个答案:

答案 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

上的演示