Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Robson Rodrigues

Calculo de Horas Trabalhadas

Recommended Posts

Boa noite

 

Estou precisando fazer um sql que calcule as horas trabalhadas de um funcionário.

 

Na tabela, tenho os campos: Entrada, Saida_almoco, entrada almoço, Saida, Jornada.

 

Nela tenho as seguintes marcações:

 

Entrada: 08:00:00

Saida Almoço: 12:00:00

Entrada Almoço: 14:00:00

saída 18:00:00

Jornada : 08:00:00

 

Tenho então total de horas: 10:00:00

intervalo : 02:00:00

trabalhadas = total - intervalo = 08:00:00

Jornada = trabalhadas - jornada = 00:00:00

 

achei essa função que que me calcula a diferença entre duas horas:

 

FUNCTION fn_Calcula_horas (data1 in date,data2 in date)

RETURN varchar2 IS

 

BEGIN

if data1 is not null and data2 is not null then

return(substr(to_char(abs(data1-data2)*24,'00D00000'),2,2)||':'||

lpad(round(to_number(substr(to_char(abs(data1-data2)*24,'00D00000'),4,5))*60

),2,'0'));

else

return('00:00');

end if;

end;

 

Gostaria de alguma função que eu passasse os 5 parâmetros e dele me desse o calculo final.

 

Obrigado

 

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Saida almoco - entrada no trampo

+

Saida trampo - volta almoco

=

Tempo total de trampo

 

Compare com a carga do infeliz ...

 

Espero ter ajudado.Lembre que vc tem a diferença entre horas

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Então Motta, cheguei nesse calculo também. A questão é que não consegui montar isso em uma função. Voce poderia me postar um exemplo de como ficaria uma funcao com fazendo esse calculo.

 

Obs rachei com o infeliz.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posto amanhã, tou no tablet, é impossivel editar codigo num tablet ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

algo assim :

FUNCTION fn_Calcula_horas (p_entrada in date,p_saida_almoco in date,p_volta_almoco in date,p_saida in date)

RETURN number IS  /*horas*/

vn_horas number;

 

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  vn_horas := vn_horas + ((p_saida-p_volta_almoco)*24);
  return vn_horas;
end;

 


Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta desculpe mas não consegui fazer essa função rodar, fiz um teste assim.

 

select fn_Calcula_horas_new('12:00:00 hh24:mi:ss','08:00:00 hh24:mi:ss','18:00:00 hh24:mi:ss','14:00:00 hh24:mi:ss') from dual

 

Da erro que o mes não é valido.

 

Lembrando que meu campo de horas é varchar

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O campo no BD é gravado neste formato [12:00:00 hh24:mi:ss] ? Como char?

 

A function original que vc publicou recebia data, ela funcionava ainda de forma parcial ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No campo do BD grava apenas a hora por exemplo 08:00:00 como char

 

Na função que postei no começo executo assim por exemplo:

 

select fn_calcula_horas( to_date('18:00:00','hh24:mi:ss'), to_date('08:00:00','hh24:mi:ss'))Total_Horas from dual

 

Ou seja ela converte o char para date e depois faz o calculo.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz a mesma conversão na function que eu fiz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta conforme você orientou, coloquei assim agora:

 

select fn_Calcula_horas_new(to_date('12:00:00 hh24:mi:ss'),to_date('08:00:00 hh24:mi:ss'),to_date('18:00:00 hh24:mi:ss'),to_date('14:00:00 hh24:mi:ss')) from dual

 

Só que retornou o erro:

 

*** SCRIPT START : Session:PROREG@ARIUS(1) 21/06/2013 11:53:34 ***
Processing ...
select fn_Calcula_horas_new(to_date('12:00:00 hh24:mi:ss'),to_date('08:00:00 hh24:mi:ss'),to_date('18:00:00 hh24:mi:ss'),to_date('14:00:00 hh24:mi:ss')) from dual

select fn_Calcula_horas_new(to_date('12:00:00 hh24:mi:ss'),to_date('08:00:00 hh24:mi:ss'),to_date('18:00:00 hh24:mi:ss'),to_date('14:00:00 hh24:mi:ss')) from dual
*
ORA-01843: n?o e um mes valido

*** Script stopped due to error ***
*** SCRIPT END : Session:PROREG@ARIUS(1) 21/06/2013 11:53:35 ***

Compartilhar este post


Link para o post
Compartilhar em outros sites

TEM DE SER ASSIM

 

to_date('12:00:00','hh24:mi:ss')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza Motta, acertei e agora rodou, ficando assim:

 

select fn_Calcula_horas_new(to_date('08:00:00','hh24:mi:ss'),to_date('12:00:00','hh24:mi:ss'),to_date('14:00:00','hh24:mi:ss'),to_date('18:32:00','hh24:mi:ss'))Horas from dual

 

A questão agora é que nesse caso ele me retornou que o cara trabalhou 8,533333333333333333333333333333333333-
33 .

 

Quando na verdade ele trabalhou 08:32:00

Compartilhar este post


Link para o post
Compartilhar em outros sites

TENTE ASSIM

 

 

FUNCTION fn_Calcula_horas (p_entrada in date,p_saida_almoco in date,p_volta_almoco in date,p_saida in date)

RETURN VARCHAR2 IS  /*horas*/

vn_horas number;

VS_HORAS VARCHAR2(50);

 

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);
  VS_HORAS := TO_CHAR(TO_DATE('01012013','DDMMYYYY') + (VN_HORAS/24),'HH24:MI:SS');
  RETURN VS_HORAS;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show de Bola Motta.

 

Assim deu certo. Muito obrigado pela força.

 

Abraço



Motta só mais uma coisinha, como ficaria a função acrescentando um parametro com a jornada(tb é um campo char) e ele fazer o mesmo calculo da ultima funçao que você passou - a jornada.

 

Por exemplo a Jornada é 08:00:00 mas ele trabalhou 09:22:00 então ele tem 01:22:00 de horas extra.

a jornada é 08:00:00 mas ele trabalhou 07:20:00 então ele deve 00:40:00.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como está não dá pois o retorno e string, deveria ser numérico e ter uma comparação.

 

Depende do que se quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não teria como fazer o resultado da função depois tranformar em date e pegar o campo jornada e transforma tb em date e fazer o calculo?

 

Leigamente seria como

 

select to_date(fn_Calcula_horas(to_date('08:10:00','hh24:mi:ss'),to_date('12:00:00','hh24:mi:ss'),to_date('14:00:00','hh24:mi:ss'),to_date('18:32:00','hh24:mi:ss')-to_date('08:00:00','hh24:mi:ss'))Horas from dual;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta

 

Sei que já estou enchendo o saco, mas essa questão de calcular horas esta me deixando louco,

 

É o seguinte, tive que mudar na tabela os campos de data que era varchar para date.

 

Então tenho a tabela com a seguinte estrutura:

 

CREATE TABLE mp_marcacao (
id                            NUMBER(9,0),
data                        DATE,
ds                           VARCHAR2(20),
id_func                   NUMBER(9,0),
entrada                  DATE,
saida_almoco        DATE,
entrada_almoco    DATE,
saida                     DATE,
evento                   NUMBER(9,0),
jornada                  DATE)

 

 

Então os valores estão sendo gravados assim:

 

ID   DATA       DS             ID_FUNC  ENTRADA            SAIDA_ALMOCO        ENTRADA_ALMOCO      SAIDA               EVENTO   JORNADA       
--- ----------- -------------- -------- ------------------ ------------------- ------------------- ------------------- -------- ------------------
207 10/06/2013  segunda-feira  38       10/06/2013 8:00:00 10/06/2013 12:00:00 10/06/2013 14:00:00 10/06/2013 19:32:00  1       10/06/2013 8:00:00


tentei usar a função que você havia me passado, mas não funcionou

 

 

 

select
fn_Calcula_horas(to_date(m.entrada,'hh24:mi:ss'),to_date(m.saida_almoco,'hh24:mi:ss'),to_date(m.entrada_almoco,'hh24:mi:ss'),to_date(m.saida,'hh24:mi:ss'))Horas
from mp_marcacao m

 

 

Dando a mensagem de:

 

ORA-01830: a imagem do formato da data termina antes de converter a string de entrada inteira

 

Como posso fazer um função com base na tabela acima:

 

Calcule o total de horas trabalhadas - Excluindo o horario de almoco

A diferença entre jornada e o total de horas trabalhadas, por exemplo

 

Jornada Trabalhada Diferença

08:00:00 - 08:32:00 00:32:00

08:00:00 - 07:45:00 -00:15:00

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente

 


select mp_marcacao.*,

          fn_Calcula_horas(entrada,saida_almoco,entrada_almoco,saida) horas

from mp_marcacao

existindo a function do #14

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.