Ir para conteúdo
Fórum Script Brasil
  • 0

Calculo de campo usando TIMESTAMP


Brenno

Pergunta

Ola, 

Estou com duvida para realizar a seguinte tarefa, ou não sei! desculpe minha ignorância. 

Tenho uma tabela chamada ponto com chave composta, atributo matricula e datadia, do tipo TIMESTAMP.

No dois exemplo abaixo a pessoa entra e sai da empresa, dentro de sua jornada de trabalho, sendo que contem duas jornadas de trabalho 08:00 as 12:00 é 12 :00 as 18:00.

No exemplo 1, a matricula 1212 entrou para sua jornada no horário normal 12:00, porem teve que sair para resolver um problema particular saiu as 15:00, logo voltou as 16:00 é esqueceu de bater o ponto de sair da empresa, que seria 18:00.

No exemplo 2, a matricula 1313 a pessoa fez sua jornada normal de 08:00 as 12:00

Tenho que fazer um calcular para sabe se esta com horas positivas ou negativas.

segue abaixo a table para melhor entendimento.

CREATE TABLE pontos
(
  matricula integer NOT NULL,
  datadia timestamp without time zone NOT NULL,
  CONSTRAINT chave_primaria_composta PRIMARY KEY (matricula, datadia),
  CONSTRAINT chave_primaria FOREIGN KEY (matricula)
      REFERENCES pessoa (matricula) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

Exemplo 1 

Matricula                   Data dia

1212        2019-03-08 12:00:00
1212        2019-03-08 15:00:00
1212        2019-03-08 16:00:00

soma:  Horas trabalhadas -> 

Exemplo 2 

Matricula              Data dia

1313                 2019-03-08 08:00:00
1313                 2019-03-08 12:00:00

soma:  Horas trabalhadas -> 04:00:00

 

Obrigado pela atenção e ajuda.
 

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

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_

Editado por douglascso
Link para o comentário
Compartilhar em outros sites

  • 0

Douglas Carlos só tenho que agradecer pela ajuda, você fenomenal.

Tenho que estuda para entender, vi que está usando coalesce uma função, o meu nível de conhecimento e muito a baixo (rsrsrs).

Tinha feito da seguinte forma a baixo, porém essa sua solução e fantástica, vou usar.

 

CASO 1

SELECT PESSOA.MATRICULA, PESSOA.NOME, PONTOS.DATADIA

FROM PESSOA

INNER JOIN PONTOS

ON PESSOA.MATRICULA = PONTOS.MATRICULA AND PESSOA.MATRICULA = 1010

WHERE CAST(datadia AS Date) Between '2019-03-26' AND '2019-03-26'

 

1010;"ASIS DE OLIVEIRA";"2019-03-26 12:00:33.096"

1010;"ASIS DE OLIVEIRA";"2019-03-26 15:00:40.113"

1010;"ASIS DE OLIVEIRA";"2019-03-26 16:05:47.489"

1010;"ASIS DE OLIVEIRA";"2019-03-26 18:00:00.265"

 

Pego esses valores coloco em variável e realizo os cálculos, essa situação, a pessoa teve seu dia trabalho de 4:55, sabendo que essa pessoa trabalha 6:00 por dia, 12:00 as 18:00, o calulo e feito usando somente horas e minutos.

No dia normal de trabalho a pessoa tem 2 registro, porém pode ter mais ou somente um.

Tem momento que a pessoa esquece de registar o ponto, porém pode ser justificado manualmente pelo gesto responsável.

CASO 2

SELECT PESSOA.MATRICULA, PESSOA.NOME, PONTOS.DATADIA

FROM PESSOA

INNER JOIN PONTOS

ON PESSOA.MATRICULA = PONTOS.MATRICULA AND PESSOA.MATRICULA = 1212

WHERE CAST(datadia AS Date) Between '2019-03-26' AND '2019-03-26'

 

1212;"RONALDO OLIVEIRA";"2019-03-26 12:00:33.096"

1212;"RONALDO OLIVEIRA";"2019-03-26 15:00:40.113"

1212;"RONALDO OLIVEIRA";"2019-03-26 16:00:47.489"

 

No caso 2, e pessoa esqueceu de registar o ponto de saída, as 18:00 no caso.

CASO 3

 

SELECT PESSOA.MATRICULA, PESSOA.NOME, PONTOS.DATADIA

FROM PESSOA

INNER JOIN PONTOS

ON PESSOA.MATRICULA = PONTOS.MATRICULA AND PESSOA.MATRICULA = 1212

WHERE CAST(datadia AS Date) Between '2019-03-01' AND '2019-03-30'

 

1212;"RONALDO OLIVEIRA";"2019-03-01 12:00:33.096"

1212;"RONALDO OLIVEIRA";"2019-03-01 18:00:40.113"

1212;"RONALDO OLIVEIRA";"2019-03-02 12:00:47.489"

1212;"RONALDO OLIVEIRA";"2019-03-02 18:00:47.489"

1212;"RONALDO OLIVEIRA";"2019-03-04 12:00:47.489"

1212;"RONALDO OLIVEIRA";"2019-03-04 12:00:47.489"

1212;"RONALDO OLIVEIRA";"2019-03-04 18:00:47.489"

1212;"RONALDO OLIVEIRA";"2019-03-05 12:00:47.489"

1212;"RONALDO OLIVEIRA";"2019-03-05 18:00:47.489"

…..

No caso 3 onde a pessoa não registrou o ponto de saída, somente de entrada.

Dentro dessa pesquisa e possível tira a batida ímpares?

Imagem somente para ilustrar a ideia. 

Desde já agradeço pela ajuda e atenção.

 

 

Editado por Brenno
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...