2011-08-03 321 views
1

我有我的数据库SQL查询来获取平均时间

用户名,日期,时间,LoginType

UserName is a varchar field 
Date is a date field 
Time is a time field (in 24 hour format) 
LoginType is a varchar field 

LoginType可以包含两个字符串的 “LOGIN” 一个, “关机”

4列

我想获得有人登录或关机的平均时间 我也想知道无早,早熟的三角洲。

因此,对于这个例子,让我们假设学生必须在8:30和必须LOGOFF 10:30

衡量某人类,以便让还假设样本数据如下

George.Lucas 8:45 2011-07-22 LOGIN 
Eric.TheRed 9:00 2011-07-22 LOGIN 
Dr.Who 9:01 2011-07-22 LOGIN 
Dr.Who 11:01 2011-07-22 SHUTDOWN 
George.Lucas 11:45 2011-07-22 SHUTDOWN 
Eric.TheRed 12:00 2011-07-22 SHUTDOWN 
  1. 我们可以看到乔治迟到了15分钟,并且他关机了1小时15分迟
  2. 埃里克迟了30分钟登录
  3. 埃里克是2小时30分钟迟到SHUTDOWN
  4. Dr.Who为3​​1分钟迟到LOGIN
  5. Dr.Who为3​​1分钟迟到SHUTDOWN

感谢

+0

是否有可能会有重复的用户名在数据中来自多个会话? –

+0

是的,可能在同一天有多个记录供同一个人使用。 –

回答

1

这会给你的平均时间给定的用户登录了和关闭之间,即使有同一天多个会话,并假设用户需要关机再次登录前:

SELECT login.UserName, 
    AVG(shutdown.Date - login.Date) 
FROM table login, 
    table shutdown 
WHERE login.UserName = shutdown.UserName 
     AND login.LoginType = 'LOGIN' 
     AND shutdown.LoginType = 'SHUTDOWN' 
     AND shutdown.Date = (SELECT MIN(t.Date) 
          FROM table t 
          WHERE t.UserName = login.UserName 
           AND t.LoginType = 'SHUTDOWN' 
           AND t.Date > login.Date) 
GROUP BY login.UserName; 

要找出预期和有效的登录/ shutdo之间的区别在时间上,你只需要分别从login.Timeshutdown.Time中减去8:30和10:30。

+0

你好,谢谢你的回应。但是我看到你的计算给出了SHUTDOWN和LOGIN之间的区别。我需要两个LOGIN在不同日期之间的平均值(如7.22.2011到8.3.2011)。还需要SHUTDOWN的 –

+0

之间的AVG这不是我正在寻找,但因为没有人知道。我会“接受”你的回答。 –