Ir para conteúdo

Arquivado

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

Robson Rodrigues

Calculo de Horas Trabalhadas

Recommended Posts

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 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calcule vs_horas nao como char mas como date e use a parte data de jornada para obter o ddmmyyyy.

Estou editando num tablet quando estiver num pc post o codigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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 NUMBER IS  /*horas*/

vn_horas number;

VD_jornada_exec DATE;

 

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);


  VD_jornada_exec  := TO_CHAR(TRUNC(p_jornada)  + (VN_HORAS/24),'HH24:MI:SS');
  RETURN (p_jornada - VD_jornada_exec);
end;

teste aí, retorna a diferença da jornada prevista x realizada, supõe que jornada tenha a data/hora da jornada, este campo ficaria melhor como NUMBER número de horas da jornada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Noite Motta

 

Criei a função acima e rodei-a dessa forma:

 

select
m.*,
fn_Horas_extra(m.entrada,m.saida_almoco,m.entrada_almoco,m.saida,m.jornada)Horas_Trabalhadas
from
mp_marcacao m
where
m.id_func = 38
order by
m.data

 

 

Obs mudei o nome da função para fn_horas_extra

 

só de deu o seguinte erro

 

ORA-01843: n?o e um mes valido
ORA-06512: em "PROREG.FN_HORAS_EXTRA", line 16

 

 

Apenas lembrando que os 5 campos:

Entrada

Saida Almoço

Entrada Almoço

Saida

Jornada

 

São do tipo date e estão no formato DD/MM/YYYY HH:MM:SS como abaixo

 

select
m.entrada,m.saida_almoco,m.entrada_almoco,m.saida,m.jornada
from
mp_marcacao m
where
id = 207

      ENTRADA           SAIDA_ALMOCO       ENTRADA_ALMOCO          SAIDA              JORNADA       
------------------- ------------------- ------------------- ------------------- -------------------
 10/06/2013 8:00:00 10/06/2013 12:00:00 10/06/2013 14:00:00 10/06/2013 19:32:00  10/06/2013 8:00:00
 

Obrigado

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

TO_CHAR(TRUNC(p_jornada) + (VN_HORAS/24),'HH24:MI:SS');

 

Por

 

(p_jornada+ (VN_HORAS));

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz a Alteração acima e ficou assim:

 

create or replace
FUNCTION fn_horas_extra (p_entrada in date,p_saida_almoco in date,p_volta_almoco in date,p_saida in date,p_jornada in date)
RETURN NUMBER IS  /*horas*/
vn_horas number;
VD_jornada_exec DATE;

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);


  VD_jornada_exec  :=  (p_jornada-(VN_HORAS));
  RETURN (p_jornada - VD_jornada_exec);
end;

 

 

Executando

 

select
m.*,
fn_Horas_extra(m.entrada,m.saida_almoco,m.entrada_almoco,m.saida,m.jornada)Horas_Extra
from
mp_marcacao m
where
m.id = 207
order by
m.data

 

 

Mostrou esse resultado:

 

    ID             DATA                 DS            ID_FUNC        ENTRADA           SAIDA_ALMOCO       ENTRADA_ALMOCO          SAIDA          EVENTO         JORNADA                     HORAS_EXTRA              
---------- ------------------- -------------------- ---------- ------------------- ------------------- ------------------- ------------------- ---------- ------------------- --------------------------------------
       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 9,533333333333333333333333333333333333-

 

 

O resultado esperado seria com base nesse calculo:

 

Entrada             : 08:00:00
Saida almoço    :12:00:00
Entrada Almoço: 14:00:00
Saida                :19:32:00
 
Total de Horas: 11:32:00
Horas Trabalhadas: 09:32:00
Hora Extra: 01:32:00 - Esse seria o resultado da Função.
 

 

 

Mais uma vez muito obrigado pela atenção que você esta dando ao meu caso.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente converter tudo para data/hora e faça a diferença.

 

ou converta para segundos.

 

O campo jornada tem a data do dia ou só a hora, não tendo será preciso trazer tudo para a mesma data.

 

---

A ideia básica é ter o tempo trabalhado na mesma unidade que o previsto, daí é uma simples subtração.

 

As funcões basicas são

 

to_date - converte string para data

to_char - converte data para string

 

subtracao de datas dá um tempo em dias ou fração de dias.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Tarde Motta, desculpe minha ignorancia mas não entendi.

 

Todos os campos em questão são do tipo DATE e gravado como DD/MM/YYYY HH:MM:SS

 

É justamente essas conversões que não estou conseguindo fazer dentro da função.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente isto

 

 

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;

VD_jornada_exec DATE;

 

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);


  VD_jornada_exec  := TRUNC(p_jornada)  + (VN_HORAS/24);

  vn_horas :=  (p_jornada - VD_jornada_exec);  

  vs_saida := to_char(trunc(sysdate) + vn_horas,'hh24:mi:ss');
 

  return vs_saida;
end;

 


Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei criar função como esta acima, mas foi reclamado que faltava declarar então a declarei assim:

 

vs_saida DATE;

 

Ficando a função assim:

 

create or replace
FUNCTION fn_Horas_extra (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;

VD_jornada_exec DATE;

vs_saida DATE;

 

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);


  VD_jornada_exec  := TRUNC(p_jornada)  + (VN_HORAS/24);

  vn_horas :=  (p_jornada - VD_jornada_exec);  

  vs_saida := to_char(trunc(sysdate) + vn_horas,'hh24:mi:ss');
 

  return vs_saida;
end;

 

e deu o seguinte erro:

 

 
ORA-01843: n?o e um mes valido
ORA-06512: em "PROREG.FN_HORAS_EXTRA", line 22

 

Se eu fizer o select sem chamar a função o resultado dos campos é esse:

 

    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
 

 

Declarei certo na função?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que agora vai, esta num bloco pois testei aqui.

Só arrumar numa function ou procedure, vou até guardar sito.

 

 

DECLARE
P_ENTRADA  DATE;
P_SAIDA_ALMOCO  DATE;
P_VOLTA_ALMOCO   DATE;
P_SAIDA  DATE;
p_jornada   date;
VN_HORAS NUMBER;
VD_JORNADA_EXEC DATE;
vs_saida varchar2(50);
BEGIN
  P_ENTRADA       := TO_DATE('15/07/2013 09:53:12','dd/mm/yyyy hh24:mi:ss');
  P_SAIDA_ALMOCO  := TO_DATE('15/07/2013 13:53:12','dd/mm/yyyy hh24:mi:ss');
  P_VOLTA_ALMOCO  := TO_DATE('15/07/2013 14:33:52','dd/mm/yyyy hh24:mi:ss');
  P_SAIDA         := TO_DATE('15/07/2013 19:00:00','dd/mm/yyyy hh24:mi:ss');
  p_jornada       := to_date('15/07/2013 08:00:00','dd/mm/yyyy hh24:mi:ss');
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);
  VD_JORNADA_EXEC  := TRUNC(P_JORNADA)  + (VN_HORAS/24);
  VN_HORAS :=  (P_JORNADA - VD_JORNADA_EXEC);
  IF VN_HORAS <= 0 THEN
    VS_SAIDA := 'devemos ao infeliz ' || TO_CHAR(TRUNC(SYSDATE) + ABS(VN_HORAS),'hh24:mi:ss') || ' horas';
  ELSE
    VS_SAIDA := 'o infeliz nos deve ' || TO_CHAR(TRUNC(SYSDATE) + ABS(VN_HORAS),'hh24:mi:ss') || ' horas';
  end if;
  dbms_output.put_line(VS_SAIDA);
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta tentei criar a função assim:

 

 

create or replace
FUNCTION fn_extra (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*/

P_ENTRADA  DATE;
P_SAIDA_ALMOCO  DATE;
P_VOLTA_ALMOCO   DATE;
P_SAIDA  DATE;
p_jornada   date;
VN_HORAS NUMBER;
VD_JORNADA_EXEC DATE;
vs_saida varchar2(50);

BEGIN
  P_ENTRADA       := TO_DATE('15/07/2013 09:53:12','dd/mm/yyyy hh24:mi:ss');
  P_SAIDA_ALMOCO  := TO_DATE('15/07/2013 13:53:12','dd/mm/yyyy hh24:mi:ss');
  P_VOLTA_ALMOCO  := TO_DATE('15/07/2013 14:33:52','dd/mm/yyyy hh24:mi:ss');
  P_SAIDA         := TO_DATE('15/07/2013 19:00:00','dd/mm/yyyy hh24:mi:ss');
  p_jornada       := to_date('15/07/2013 08:00:00','dd/mm/yyyy hh24:mi:ss');
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);
  VD_JORNADA_EXEC  := TRUNC(P_JORNADA)  + (VN_HORAS/24);
  VN_HORAS :=  (P_JORNADA - VD_JORNADA_EXEC);
  IF VN_HORAS <= 0 THEN
    VS_SAIDA := 'devemos ao infeliz ' || TO_CHAR(TRUNC(SYSDATE) + ABS(VN_HORAS),'hh24:mi:ss') || ' horas';
  ELSE
    VS_SAIDA := 'o infeliz nos deve ' || TO_CHAR(TRUNC(SYSDATE) + ABS(VN_HORAS),'hh24:mi:ss') || ' horas';
  end if;
  dbms_output.put_line(VS_SAIDA);
end;

 

 

Mas deu a seguinte msg ficando invalida:

 

Warning PLS-00410: Compos duplicados em record, table ou litsa de argumentos não permitida
Warning PL/SQL: Compilation unit analysis terminated

O que coloquei errado?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

NÃO, a atribuição que fiz dos parametros foi para testar, não copie senão dá errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tirei as atribuições de horários e ficou assim:

 

 

create or replace
FUNCTION fn_extra (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*/

P_ENTRADA  DATE;
P_SAIDA_ALMOCO  DATE;
P_VOLTA_ALMOCO   DATE;
P_SAIDA  DATE;
p_jornada   date;
VN_HORAS NUMBER;
VD_JORNADA_EXEC DATE;
vs_saida varchar2(50);

BEGIN
  vn_horas := ((p_saida_almoco-p_entrada)*24);
  VN_HORAS := VN_HORAS + ((P_SAIDA-P_VOLTA_ALMOCO)*24);
  VD_JORNADA_EXEC  := TRUNC(P_JORNADA)  + (VN_HORAS/24);
  VN_HORAS :=  (P_JORNADA - VD_JORNADA_EXEC);
  IF VN_HORAS <= 0 THEN
    VS_SAIDA := 'devemos ao infeliz ' || TO_CHAR(TRUNC(SYSDATE) + ABS(VN_HORAS),'hh24:mi:ss') || ' horas';
  ELSE
    VS_SAIDA := 'o infeliz nos deve ' || TO_CHAR(TRUNC(SYSDATE) + ABS(VN_HORAS),'hh24:mi:ss') || ' horas';
  end if;
  dbms_output.put_line(VS_SAIDA);
end;

 

 

O que mais tenho que alterar?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

P_ENTRADA DATE;

P_SAIDA_ALMOCO DATE;

P_VOLTA_ALMOCO DATE;

P_SAIDA DATE;

p_jornada date;

 

Retire esta declaração.

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.