2010-04-26 8 views
0

Exécution de SQL Server 2008, et je suis définitivement un nouvel utilisateur SQL.Requête SQL Server Question

I ont une table qui comporte 4 colonnes:

EmpNum, User, Action, Updatetime 

utilisateur ouvre une session dans et hors d'un système, il est enregistré dans la base de données. Par exemple, si les journaux user1 dans le système, puis à 5 minutes plus tard, une simple requête (select * from mise à jour) ressemblerait à ceci:

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

Je suis en train d'interroger le empnum, l'utilisateur, Action, je (dans le temps), O (temps de sortie) et le temps total.

+0

Peut-il y avoir plusieurs entrées (connexion/déconnexion) par utilisateur dans le tableau? Voulez-vous voir toutes les périodes? –

+0

Oh oui. Ainsi, User1 peut avoir 50 actions I, O par jour. – Lp1

Répondre

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' 

EDIT Dans vos commentaires que vous avez demandé TimeWorked. Étant donné que vous utilisez SQL Server 2008, vous pouvez utiliser un Outer Apply pour calculer le temps d'arrêt pour chaque ligne in-time. Ensuite, il est simple d'utiliser 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

Merci à vous deux, je vais essayer ces maintenant. – Lp1

+0

Thomas, Votre requête a fonctionné, je me demande juste comment je peux obtenir une colonne de plus dans les résultats. A la fin je voudrais avoir un TimeWorked, qui donne le temps total d'un utilisateur dans le système. J'essaie toujours d'envelopper ma tête autour des T1 et T2. Certainement appris quelque chose de nouveau aujourd'hui. – Lp1

+0

Merci encore pour l'aide. Vous avez sauvé ma santé mentale. – Lp1

2

Vous pouvez essayer quelque chose comme

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 

Sortie

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