Boa tarde,
muito interessante a sua pergunta, o horário que a pessoa bateu as marcações de ponto chama-se folha de ponto e nela não se calcula a soma dos horários trabalhados, apenas exibi os ponto batidos, e essa marcação não poderia ser alterada.
Um relatório de conferencia de horas trabalhadas pode-se adicionar, remover ou alterar as marcações para refletir o tempo trabalhado. No caso 1 eu iria lançar o horário que a pessoa esqueceu de bater o ponto para poder fazer a conta corretamente, pois não é possível o sistema calcular a segunda jornada de trabalho. Mas para isso o funcionário teria que comunicar o fato para que as providencias fossem tomadas.
Segue um exemplo de consulta:
SELECT (coalesce(b.hora, '00:00:00')::INTERVAL - coalesce(a.hora, '00:00:00')::INTERVAL) + ((coalesce(d.hora, '00:00:00')::INTERVAL - coalesce(c.hora, '00:00:00')::INTERVAL) * 1) AS horas_trabalhadas
FROM (select row_number() OVER () as id, matricula, extract(hour from datadia) || ':' || extract(minutes from datadia) || ':' || extract(seconds from datadia)
AS hora from pontos where matricula = 1313 and datadia between '2019-03-08 00:00:01' and '2019-03-08 23:59:59' order by datadia) a
full outer join
(select row_number() OVER () as id, matricula, extract(hour from datadia) || ':' || extract(minutes from datadia) || ':' || extract(seconds from datadia)
AS hora from pontos where matricula = 1313 and datadia between '2019-03-08 00:00:01' and '2019-03-08 23:59:59' order by datadia) b ON b.matricula = a.matricula and b.id = 2
full outer join
(select row_number() OVER () as id, matricula, extract(hour from datadia) || ':' || extract(minutes from datadia) || ':' || extract(seconds from datadia)
AS hora from pontos where matricula = 1313 and datadia between '2019-03-08 00:00:01' and '2019-03-08 23:59:59' order by datadia) c ON c.matricula = a.matricula and c.id = 3
full outer join
(select row_number() OVER () as id, matricula, extract(hour from datadia) || ':' || extract(minutes from datadia) || ':' || extract(seconds from datadia)
AS hora from pontos where matricula = 1313 and datadia between '2019-03-08 00:00:01' and '2019-03-08 23:59:59' order by datadia) d ON d.matricula = a.matricula and d.id = 4
limit 1;
Douglas Carlos da Silva Oliveira
Analista de TI, QA, DBA @douglas_carlos_