TSQL平均时间

时间:2015-09-04 01:31:20

标签: sql-server tsql stored-procedures sql-server-2012

我有一个简单的存储过程,我用它来显示一些基本的用户统计信息。我正在显示提交的总数,所有这些提交的总花费时间以及平均花费的时间。

我遇到了两个问题。首先,当内部选择中有多个记录时,这会中断。

我的第二个问题是如何正确计算该用户所有记录的平均时间。

有人可以指出一些方法我可以更改下面的代码,以获得所有记录的总时间和平均时间,而不只是一个?

SELECT count(itemID) AS totalSubmissions,
       CONVERT(VARCHAR(20), GETUTCDATE(), 100) as lastUpdate,
       (
        SELECT COALESCE(DATEDIFF(MINUTE, s.startTime, s.endTime + 1) , 0)
        FROM itemTracker_records as s
        WHERE QID = @QID
       ) as totalTime,
       (
        SELECT COALESCE(DATEDIFF(MINUTE, s.startTime, s.endTime + 1) , 0)
        FROM itemTracker_records as s
        WHERE QID = @QID
       ) as averageTime 
FROM   itemTracker_records
WHERE  QID = @QID
FOR    XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root')

1 个答案:

答案 0 :(得分:2)

  1. 当然会破坏 - 子查询中没有聚合。虽然,在这种特殊情况下,它看起来并不需要它们。
  2. 令人惊讶的是,AVG()函数计算平均值。
  3. (有教育意义的猜测)你可能意味着你需要至少一分钟时间,如果指定了开始和结束但是相等?唉,在您的代码中添加1天 - 已修复。
  4. 所以结果看起来与此相似:

    SELECT count(r.itemID) AS totalSubmissions,
        CONVERT(VARCHAR(20), GETUTCDATE(), 100) as lastUpdate,
        sum(isnull(DATEDIFF(MINUTE, r.startTime, r.endTime) + 1 , 0)) as [totalTime],
        avg(isnull(DATEDIFF(MINUTE, r.startTime, r.endTime) + 1 , 0)) as [averageTime]
    FROM   dbo.itemTracker_records r
    WHERE  r.QID = @QID
    FOR    XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root');
    

    最后但并非最不重要:永远不要忘记模式和对象别名,除非你故意试图混淆某人,包括你自己。