Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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. ObrigadoEntã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
Posto amanhã, tou no tablet, é impossivel editar codigo num tablet ...
rsrss com certeza tablet complica. Fico no Aguardo e já de antemão obrigado pela força.
Abraço
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;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
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 ?
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
Faz a mesma conversão na function que eu fiz.
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
* Script stopped due to error
SCRIPT END : Session:PROREG@ARIUS(1) 21/06/2013 11:53:35
TEM DE SER ASSIM
to_date('12:00:00','hh24:mi:ss')
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
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;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
Como está não dá pois o retorno e string, deveria ser numérico e ter uma comparação.
Depende do que se quer.
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;
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
tente
select mp_marcacao.*,
fn_Calcula_horas(entrada,saida_almoco,entrada_almoco,saida) horas
from mp_marcacao
existindo a function do #14
Muito bom Motta, chamando assim a função funcionou.
Agora como posso fazer para calcular a diferença entre o campo jornada e o resultado dessa função?
Obrigado
Jornada é DATE, o que é gravado nele ?
A function retorna uma string no formato HH24:MI:SS
calcular a diferença entre o campo jornada e o resultado dessa função
Diferença em que ? horas, minutos etc ?
Sim o campo jornada é date
preciso pegar o resultado dessa função e calcular a diferença, por exemplo
Resultado da função: 09:32:00
jornada : 08:00:00
Diferenca : 01:32:00
O campo jornada esta gravado por exemplo: 12/07/2013 08:00:00
Obrigado
O returno da function poderia ser date, ou a própria retornar a diferença entre a hora estimada e a real, deve haver uma margem de tolerancia aí , creio que 5 minutos em cada entrada/saída.
A alteração é simples, consegua fazer ?!
Nesse caso não ha tolerancia pois é controle de banco de horas.
A maneira com esta retornando é perfeita HH:MM:SS gostaria que a diferena fosse retornada assim também.
Tententei adicionar mais um parametro na função e fazer o calculo, mas não consegui.
Posta aí o que vc fez.
Boa Tarde Motta
Tentei assim
FUNCTION fn_Calcula_horas (p_entrada in date,p_saida_almoco in date,p_volta_almoco in date,p_saida in date,p_jornada 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);
VN_Horas := p_jornada - vn_horas;
VS_HORAS := TO_CHAR(TO_DATE('01012013','DDMMYYYY') + (VN_HORAS/24),'HH24:MI:SS');
RETURN VS_HORAS;
end;
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