[RESOLVIDO] Somando horas trabalhadas

Prezados bom dia/tarde/noite :grinning:.

Sei qui terei muitas perguntas a fazer para o projeto que estou desenvolvendo, mas vamos aos poucos. É o seguinte: Tenho um histórico de trabalho em cada tarefa, assim: Uma tarefa é aberta para ser trabalhada, o responsável por tal tarefa ao iniciar a execução da mesma o sistema grava a data/hora que foi iniciado o trabalho, quando o cara parar para um intervalo ou por qualquer motivo, ele vai no status e muda para ‘PARADO’, neste momento o sistema grava a data/hora que ele parou e grava a diferença em time hhmmss em um campo {tempoUsado} do tipo time(). Ex.: se ele iniciou o trabalho às 08:00 e parou para lanchar às 08:30, no campo {tempoUsado} ele grava ‘00:30:00’. Quando ele volta, o ele insere um novo registro e passa a usar o status como ‘TRABALHO’, o sistema grava a data/hora que iniciou o trabalho novamente e quando parar outra vez ou concluir, o o sistema faz o mesmo processo, grava a data/hora que terminou e grava o tempo usado, e assim sucessivamente quantas vezes forem necessárias. Isso ele está fazendo de boa. O que eu quero aqui, é que quando o cara terminar de fazer todo o serviço da tarefa em curso, o sistema some todos os valores da tabela no campo {tempousado} transformando em hh:mm:ss totais para que eu possa registrar que tal tarefa teve um consumo de X tempo de trabalho.

Desde já agradeço a todos.

se eu bem entendi, usando o time ele grava no db a data e hora exata em segundos.
no momento que estava escrevendo eu gerei um time em php q deu o seguinte: 1558959684.
a sacada é:
1 - diminuir o time de fim pelo time de inicio de cada intervalo. $timeINI - $timeFIM
2 - somar o resultado de cada intervalo.
3 - <?php echo gmdate("H:i:s", $resultado_somado);?>

Não Clarck, é assim: o campo time está gravando o tempo já calculado, exemplo: iniciei o job às 08:30, e parei para o intervalo às 09:05, isso significa que eu trabalhei por 00:35:00 minutos, estes 35 minutos estão sendo gravado no campo da tabela nomeado {tempousado} no mesmo formato acima citado: 00:35:00, é assim que está sendo gravado.

Só que ao terminar o intervalo, eu retorno ao job às 10:00 e paro novamente às 10:15, então trabalhei por 15 minutos, e no mesmo formato dos 35 minutos, é gravado também um novo registro com este novo tempo trabalhado, e assim sucessivamente. Então eu quero fazer um select para somar os tempos trabalhados, que neste caso dá 15+35 minutos serão: 50 minutos trabalhados, mas quero no mesmo formato (00:50:00) para eu gravar em um campo em outra tabela.

trabalhar com o resultao já somado de cada intervalo é desnecessario, uma vez q vc já tem timeINI e timeFIM está guardando 2x a mesma coisa.
isso vai acumulando espaço no db.
sem contar q 00:35:00 + 00:15:00, vai dar muito mais trabalho.
mas se vai guardar o resultado de cada intervalo, pq não grava numero inteiro (35 e 15).
assim na hora usas SELECT SUM(intervalos) já vem somado tudo.
na hora de exibir vc usa uma função pra transofrmar em segundos e usa date();

não sei pra q complicar um coisa simples.

eu insisto na minha sugestão do meu post acima. simples e compacta.

Bom dia Clarck, prezado, devido a correria tive dando uma parada nesse job e agora estou com uma pequena precha para ver até onde posso continuar antes que a correria continue. Amigo, sinceramente quero pedir desculpas aqui a você e a todos, quando me referi do modo anterior, não estou tentando complicar nada, eu estou querendo aprender, sou um aprendiz em muitas coisas, por isso perguntei. Eu estive tentando usar a macro sc_time_diff para pegar a diferença, e por isso veio no array para eu pegar as partes, e isso forma a hora formatada. Nunca usei esse método que você apresentou, por esta razão me vejo diante de mais um aprendizado, e se não for incomodar gostaria que me desculpasse. Vou tentar o método que você indicou aqui e vou ver o que consigo, devido não ter usado em nenhum momento vou precisar da sintaxe das funções usadas. Desde já agradeço e caso eu tenha alguma dúvida vou postar novamente aqui, para você ou para quem puder me ajudar.

Muito obrigado

Primeiro não tem nada do que se desculpar. Não me ofendeu nem desrespeitou nada do fórum.
É bom mastigar bem certas questões e querer aprender não ofende ninguém, então não se desculpe por querer aprender. Aproveito pra afirmar que minhas respostas inicias é sempre pra estimular o raciocínio e curiosidade de quem pergunta.
Nunca foi nem nunca será intenção minha, machucar ou diminuir ninguém nesse fórum.
Eu reconheço que tenho pouca paciência.
As vezes tem pouca informação e outras tento mostrar o caminho sem dar o peixe já pescado.

mostre mais detalhes que eu te ajudo.
preciso ver como fica o registro no db dessa tua rotina.

Muito obrigado amigo, sua instrução foi e é muito útil no meu projeto. Agradecido consegui resolver.

agora explica como resolveu… pra posteridade.
com detalhes, por favor.

Beleza, resolvi da seguinte forma: meu campo que era do tipo TIME troquei para o tipo INT, assim ele vai guardar o resultado inteiro. Para que o campo recebesse este valor eu coloquei no meu evento onBeforeInsert o seguinte código:

if(({executatasks_status}==‘PARADO’)||({executatasks_status}==‘CONCLUIDO’)||({executatasks_status}==‘CANCELADO’)){
sc_error_message(“Esta opção de STATUS não pode ser aplicada sem a tarefa ter sido iniciada!”);
sc_error_exit(form_executajobs);
}else{
if({executatasks_status} == ‘PRODUZINDO’){
$tempo = time()+ 3600*(-3+date(“I”));// fiz esta variável devido meu timezone ser -3 horas
{executatasks_tempoinicial} = $tempo;
}
}

Já no evento onValidate eu inseri o seguinte código:

if({idexecutatasks}>0){
if(({executatasks_status} != ‘PRODUZINDO’)||({executatasks_status} != ‘ESPERANDO’)){
$tempo = time()+ 3600*(-3+date(“I”));// fiz esta variável devido meu timezone ser -3 horas
{executatasks_tempofinal} = $tempo;
}
}

Dessa forma sendo o status igual a ‘PRODUZINDO’ o funcionário iniciou a produção do material, quando ele parar para qualquer motivo vai marcar o campo do tipo Radio para não for nem PRODUZINDO nem ESPERANDO, qualquer outro status que for marcado e atribui o “tempofinal” fazendo uma atualização do mesmo registro no campo {tempofinal} com a hora atual, dessa forma tenho dos dois horário, de início e de fim.

Então quando eu quiser saber o tempo gasto no job em questão, eu coleto esses dados da seguinte forma:
$tempousado = {executatasks_tempofinal}-{executatasks_tempoinicial};
{tempo_usado} = gmdate(“H:i:s”,$tempousado);