2010-04-26 128 views
0

运行SQL Server 2008,我肯定是一个新的SQL用户。SQL Server查询问题

我有一个具有4列的表格:

EmpNum, User, Action, Updatetime 

用户登录到,进出的系统的,它在数据库中登记。例如,如果用户1登录到系统中,然后进行5分钟后,一个简单的查询(选择更新*)看起来像:

EmpNum User Action Updatetime 
1  User1 I  2010-01-01 23:00:00:000 
1  User1 O  2010-01-01 23:05:00:000 

我想查询Empnum,用户,操作,我(及时),O(不及时)和总时间。

+0

还能有每个用户的多个条目(登录/注销)表中?你想看看所有的时期吗? – 2010-04-26 04:43:03

+0

哦,是的。所以,User1每天可能会有50次I,O操作。 – Lp1 2010-04-26 12:39:08

回答

0
Select T1.EmpNum, T1.User, T1.UpdateTime As TimeIn 
, (Select Min(T2.UpdateTime) 
     From Table As T2 
     Where T2.EmpNum = T1.EmpNum 
     And T2.User = T1.User 
     And T2.Action = 'O' 
And T2.UpdateTime > T1.UpdateTime) As TimeOut 
From Table As T1 
Where Action = 'I' 

编辑在你的意见,你问TimeWorked。由于您使用的是SQL Server 2008,因此可以使用外部应用来计算每个时间行的外出时间。那么使用DateDiff就很简单了。

Select T1.EmpNum, T1.User 
    , T1.UpdateTime As TimeIn 
    , TimeOut.UpdateTime As TimeOut 
    , DateDiff(mi, T1.UpdateTime, TimeOut.UpdateTime) As TimeWorkedInMinutes 
From Table As T1 
    Outer Apply (
       Select Min(T2.UpdateTime) As UpdateTime 
       From Table As T2 
       Where T2.EmpNum = T1.EmpNum 
        And T2.User = T1.User 
        And T2.Action = 'O' 
        And T2.UpdateTime > T1.UpdateTime 
       ) As TimeOut 
Where Action = 'I' 
+0

谢谢你们两位,我现在要试一试。 – Lp1 2010-04-26 12:07:40

+0

Thomas, 您的查询是成功的,我只是想知道如何在结果中再添加一列。最后,我想要一个TimeWorked,它给出了用户在系统中的总时间。 我仍然试图围绕T1和T2的包装头。当然今天学到了一些新东西。 – Lp1 2010-04-26 12:21:42

+0

再次感谢您的帮助。你们救了我的理智。 – Lp1 2010-04-26 13:12:02

2

你可以尝试像

DECLARE @Table TABLE(
     EmpNum Int, 
     [User] VARCHAR(10), 
     Action VARCHAR(1), 
     Updatetime DATETIME 
) 

INSERT INTO @Table SELECT 1,'User1','I','2010-01-01 23:00:00:000' 
INSERT INTO @Table SELECT 1,'User1','O','2010-01-01 23:05:00:000' 
INSERT INTO @Table SELECT 1,'User1','I','2010-01-01 23:10:00:000' 
INSERT INTO @Table SELECT 1,'User1','O','2010-01-01 23:25:00:000' 

SELECT *, 
     DATEDIFF(mi, InTime, OutTime) Period 
FROM (
      SELECT EmpNum, 
        [User], 
        UpdateTime InTime, 
        ( SELECT TOP 1 
           Updatetime 
         FROM @Table 
         WHERE EmpNum = t.EmpNum 
         AND  Action = 'O' 
         AND  Updatetime > t.Updatetime 
         ORDER BY Updatetime 
        ) OutTime 
      FROM @Table t 
      WHERE Action = 'I' 
     ) sub 

输出

EmpNum  User  InTime     OutTime     Period 
----------- ---------- ----------------------- ----------------------- ----------- 
1   User1  2010-01-01 23:00:00.000 2010-01-01 23:05:00.000 5 
1   User1  2010-01-01 23:10:00.000 2010-01-01 23:25:00.000 15