Tenho que implementar um sistema de controle de acesso para uma empresa, que será capaz de reportar o acesso de cada funcionário em uma área específica do prédio para fornecer um relatório. Um dos requisitos é fornecer uma lista dos funcionários com mais de 3 horas extras em uma determinada janela de tempo.
O esquema da tabela que contém as informações necessárias é o seguinte.
ACTION
informa se o funcionário entrou ou saiu de um determinado nível do edifício. O resto é o tempo, o funcionário e o nível.
create table access_action
(
ID bigint auto_increment primary key,
ACTION int null,
TIMESTAMP datetime null,
level_id bigint null,
employee_id bigint null,
constraint FK_access_action_employee_id
foreign key (employee_id) references employee (ID),
constraint FK_access_action_level_id
foreign key (level_id) references level (ID)
);
um conjunto de resultados de amostra
ID ACTION TIMESTAMP EMPLOYEE_ID
1 IN 2017-05-10 09:28:00 3 9
2 IN 2017-04-24 07:49:00 3 8
3 IN 2017-02-27 07:08:00 1 9
4 IN 2017-04-26 06:15:00 1 25
5 IN 2017-02-02 09:37:00 3 24
6 OUT 2017-05-29 08:03:00 3 7
7 IN 2017-04-25 07:07:00 1 1
8 IN 2017-01-09 08:54:00 3 8
9 IN 2017-05-12 07:57:00 2 1
10 OUT 2017-02-09 08:03:00 3 30
11 IN 2017-03-09 08:56:00 3 30
12 OUT 2017-02-03 11:26:00 3 5
Acredito que sei como posso estimar as horas extras considerando a soma do tempo que cada funcionário passou dentro das dependências do prédio que dará o total de horas. Mas eu só posso imaginar como eu poderia fazer isso na camada de aplicação.
Existe uma maneira de estimar as horas extras puramente com SQL?
EDITAR
De acordo com os comentários, deve haver uma sequência estrita entre as ações de entrar-sair, portanto, criou-se o seguinte conjunto de dados .
Com base no comentário de @Akina, criei dois conjuntos um para as ações IN e outro para o OUT, que juntei a eles e subtraí o tempo gasto dentro das instalações. Portanto, posso calcular o total de horas de trabalho para cada funcionário em qualquer dia específico.
Cheguei à seguinte consulta.
Realizando a consulta nos dados o resultado é o seguinte.