Соедините дату и время входа в систему с датой и временем выхода из одной таблицы и рассчитайте рабочее время.
Таблица EmployeeLogInOut:
TransactionID bigint,
TransactionDate datetime,
Type smallint,
Automatic bit,
SalesDate datetime,
EmployeeGUID uniqueidentifier,
DepartmentGUID uniqueidentifier
См. образцы данных ниже.
Тип: 1 = вход в систему 2 = выход из системы
Автоматически: 0 = вручную 1 = автоматически
Автоматически происходит, когда сотрудник не выходит из системы в конце дня. Система автоматически отключит сотрудника в конце дня, если он не вышел из системы.
Также возможно, что сотрудник может выйти из системы автоматически, когда происходит обновление программного обеспечения и т. Д.
Для отчета мне нужно рассчитать, сколько минут сотрудник входил в систему каждый день (SalesDate).
Я пытаюсь получить свой результат за столом, например
LogOnTime datetime,
LogOffTime datetime,
DurationInMinute int,
DepartmentGUID uniqueidentifier
Но поскольку может не существовать соответствующего выхода из системы для каждого входа в систему и наоборот, при таком подходе я получаю сообщение об ошибке.
Мой сценарий:
declare @EmployeeGUID uniqueidentifier
declare @StartDate datetime
declare @EndDate datetime
set @EmployeeGUID = 'C335F76A-E757-48D9-8DFE-01096EEA6A71'
set @StartDate = '09-01-2011'
set @EndDate = '09-30-2011'
create table #result
(
LogOnTime datetime,
LogOffTime datetime,
DurationInMinute int,
DepartmentGUID uniqueidentifier
)
Insert #result(LogOnTime,LogOffTime,DurationInMinute,DepartmentGUID )
Select A.TransactionDate, B.TransactionDate,datediff(minute,A.TransactionDate, isnull(B.TransactionDate,GetDate())),A.DepartmentGUID
from
(Select Row_number() over (order by TransactionDate) as Num ,* from EmployeeLogInOut
where [Type]=1 and EmployeeGUID = @EmployeeGUID and SalesDate between @StartDate and @EndDate ) as A
LEFT JOIN
(Select Row_number() over (order by TransactionDate) as Num,* from EmployeeLogInOut
where [Type]=2 and EmployeeGUID = @EmployeeGUID and SalesDate between @StartDate and @EndDate ) as B
ON A.Num = B.Num
select * from #result
drop table #result
Пример данных:
CREATE TABLE EmployeeLogInOut(
[TransactionID] [bigint] NOT NULL,
[TransactionDate] [datetime] NOT NULL,
[Type] [smallint] NOT NULL,
[Automatic] [bit] NOT NULL,
[SalesDate] [datetime] NOT NULL,
[EmployeeGUID] [uniqueidentifier] NOT NULL,
[DepartmentGUID] [uniqueidentifier] NOT NULL
)
INSERT INTO EmployeeLogInOut VALUES
(2006,'2011-09-05 16:59:39.000',1,0,'2011-09-05 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2008,'2011-09-05 21:57:22.000',2,0,'2011-09-05 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2019,'2011-09-06 16:59:37.000',1,0,'2011-09-06 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2022,'2011-09-06 17:35:41.430',2,0,'2011-09-06 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2039,'2011-09-06 17:36:41.000',2,1,'2011-09-06 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2023,'2011-09-06 17:37:41.000',1,0,'2011-09-06 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2037,'2011-09-07 00:45:32.000',2,0,'2011-09-06 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2054,'2011-09-08 17:12:19.000',1,0,'2011-09-08 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2059,'2011-09-08 20:58:17.000',2,0,'2011-09-08 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2262,'2011-09-20 20:09:10.000',1,0,'2011-09-20 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2269,'2011-09-21 06:59:00.000',2,1,'2011-09-20 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2278,'2011-09-21 17:06:49.000',1,0,'2011-09-21 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2282,'2011-09-21 22:05:29.000',2,0,'2011-09-21 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2283,'2011-09-21 22:06:55.000',1,0,'2011-09-21 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A'),
(2284,'2011-09-21 22:09:04.000',2,0,'2011-09-21 00:00:00.000','C335F76A-E757-48D9-8DFE-01096EEA6A71','520EEFD4-DC30-4390-BB7F-FEFD83D9576A')
Благодарим за любую идею :-)
Моя мысль заключалась в том, что если соответствующее время входа в систему не существует для времени выхода из системы, то соответствующее время входа в систему может быть установлено на 06:00 фактической даты продажи.
И если в дате входа в систему отсутствует соответствующая дата и время выхода из системы, она может быть установлена на 05:59.
Или просто игнорируйте все записи входа/выхода, которые не соответствуют.
PS: я не могу изменить ни таблицу EmployeeLogInOut, ни то, как в нее заносятся данные.