SQL Server Query Question - PullRequest
       8

SQL Server Query Question

0 голосов
/ 26 апреля 2010

Запуск SQL Server 2008, и я определенно новый пользователь SQL.

У меня есть таблица с 4 столбцами:

EmpNum, User, Action, Updatetime

Пользователь входит в систему и выходит из системы, он регистрируется в базе данных. Например, если пользователь user1 входит в систему, а затем через 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, User, Action, I (по времени), O (по времени) и общее время.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Вы можете попробовать что-то вроде

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
0 голосов
/ 26 апреля 2010
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, вы можете использовать Outer Apply для расчета времени простоя для каждой временной строки. Тогда просто использовать 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...