Я предполагаю, что логика в столбце 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