Получить вход и время выхода из нескольких входов или нескольких выходов в SQL Server - PullRequest
0 голосов
/ 23 мая 2019

Я работаю в веб-приложении для управления персоналом с указанием времени входа / выхода и сопоставления с запланированной сменой.

Примечание LogType 1 означает вход часов, а 2 - выход часов.

У меня естьструктура таблицы входа в систему, как показано ниже

UserId       LogDateTime             LogType

 5005    2019-05-20 21:35:48.490        1
 5005    2019-05-20 22:25:00.000        1
 5005    2019-05-21 06:48:00.000        2
 5005    2019-05-21 07:01:15.383        2

 5006    2019-05-20 21:25:25.470        1
 5006    2019-05-20 23:48:29.568        2
 5006    2019-05-21 00:07:05.056        1
 5006    2019-05-21 07:25:35.853        2

 5007   2019-05-20 23:33:35.017         1
 5007   2019-05-21 00:18:56.087         2
 5007   2019-05-21 09:01:23.577         2

Я хочу получить входы и выходы часов в следующем формате и использовать их для отображения с запланированным сдвигом

UserId      Date            ClockIn                    ClockOut
5005      2019-05-20     2019-05-20 21:35:48.490     2019-05-21 07:01:15.383
5006      2019-05-20     2019-05-20 21:25:25.470     2019-05-21 07:25:35.853
5007      2019-05-21     2019-05-20 23:33:35.017     2019-05-21 09:01:23.577 

Любой может поделиться запросом длячто.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я предполагаю, что логика в столбце Date учитывает дату, когда пользователь назначил как регистрацию, так и выход, если пользователь назначил только регистрацию или регистрацию только записи, то будет проигнорировано (На практике может случиться, что пользователь забыл)

В любом случае для достижения этого вы должны использовать MIN(), MAX(), Group By и Having как следующий

Я думаю, что есть более хороший код для меня,но, по крайней мере, мое удовлетворение потребности

Демо : -

Create table #MyTempTable (UserId int , LogDateTime Datetime,LogType int)

Insert into #MyTempTable values (5005,'2019-05-20 21:35:48.490',1)
Insert into #MyTempTable values (5005,'2019-05-20 22:25:00.000',1)
Insert into #MyTempTable values (5005,'2019-05-21 06:48:00.000',2)
Insert into #MyTempTable values (5005,'2019-05-21 07:01:15.383',2)
Insert into #MyTempTable values (5006,'2019-05-20 21:25:25.470',1)
Insert into #MyTempTable values (5006,'2019-05-20 23:48:29.568',2)
Insert into #MyTempTable values (5006,'2019-05-21 00:07:05.056',1)
Insert into #MyTempTable values (5006,'2019-05-21 07:25:35.853',2)
Insert into #MyTempTable values (5007,'2019-05-20 23:33:35.017',1)
Insert into #MyTempTable values (5007,'2019-05-21 00:18:56.087', 2)
Insert into #MyTempTable values (5007,'2019-05-21 09:01:23.577',2)

select UserId,min(Date) Date ,min(ClockIn) ClockIn ,Max(ClockOut) ClockOut 
from (
    select UserId, Min(convert(date,LogDateTime)) Date, 
    Min(LogDateTime) ClockIn , Max(LogDateTime) ClockOut,LogType
    from #MyTempTable
    Group by UserId,LogType
    having count(convert(date,LogDateTime)) > 1
    )t
Group by UserId

Drop table #MyTempTable

Результат : -

UserId  Date        ClockIn                 ClockOut
5005    2019-05-20  2019-05-20 21:35:48.490 2019-05-21 07:01:15.383
5006    2019-05-20  2019-05-20 21:25:25.470 2019-05-21 07:25:35.853
5007    2019-05-21  2019-05-21 00:18:56.087 2019-05-21 09:01:23.577
0 голосов
/ 23 мая 2019

Попробуйте, <myTable> необходимо заменить на фактическое имя таблицы:

SELECT 
    UserId,
    CONVERT(CHAR(10), LogDateTime, 126) AS Date,
    LogDateTime AS ClockIn,
    -- this sub query will by using WHERE clause, ORDER BY, TOP 1
    -- get the closest CheckOut time for the same user
    (
        SELECT TOP 1 LogDateTime 
        FROM <myTable> AS t2 
        WHERE t2.UserId = t1.UserId 
              AND t2.LogDateTime > t1.LogDateTime
              AND LogType = 2
        ORDER BY LogDateTime ASC
    )  AS ClockOut
FROM <myTable> AS t1 
WHERE LogType = 1
    -- this sub query is to limit the result to only the latest CheckIn times
    AND t1.LogDateTime IN
    (
        SELECT MAX(t3.LogDateTime)
        FROM <myTable> AS t3
        WHERE t3.UserId = t1.UserId
          AND LogType = 1
    ) 

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...