Pessoal, já tentei de várias formas, mas não obtive sucesso. Gostaria da ajuda de vocês para solucionar este problema. A situação é a senguinte: Gostaria de somar um campo “Duração” que é do tipo TIME e colocar como soma em um relatório, onde o mesmo é totalizado por técnico.
E sua dificuldade esta onde?
Em calcular?
Por no relatório?
Caro George, agradeço sua atenção. Minha dificuldade esta em transformar o campo "tempo" que o select coloca como decimal em um campo hora, uma vez que o select foi escrito da seguinte forma:
SUM(TIME_TO_SEC(TEMPO_ATEND)) AS tempo,
Com isso ele soma todos os tempos de atendimento do campo "TEMPO_ATEND" transformando em segundos e coloca o resultado no campo criado "tempo", só que o fato de ser um campo tipo decimal ele não aceita qualquer transformação em HORA no select, como sugere alguns posts, tais como:
SEC_TO_TIME(SUM(TIME_TO_SEC(TEMPO_ATEND))) AS TEMPO,
Assim sendo, preciso encontrar uma maneira para transformar o conteúdo do campo tempo em H:i:s.
e que o mesmo apareça na coluna do relatório, totalizando por dia e pelo período estabelecido.
Eduardo
Pega a parte inteira do campo e
$hours = floor($tempo / 3600);
$seconds -= $hours * 3600;
$minutes = floor($seconds / 60);
$seconds -= $minutes * 60;
$minutes = str_pad( $minutes, 2, ‘0’, STR_PAD_LEFT );
{total} = $hours.’:’.$minutes;
George, boa tarde!
Obrigado pela sua presteza e colaboração. Como sou novato, podemos dizer assim, no desenvolvimento com essa ferramenta, também é parte da dúvida o local de colocar esse código. Coloco em “Eventos/OnRecord”? Isso fará com que até o total seja convertido? Como mencionei antes, o campo já é apresentado no detalhe da consulta, é totalizado por dia e pelo período solicitado, o fato é que tudo é apresentado em segundos. Eu já vi alguns cálculos fazendo a transformação para hora e estava com dificuldades, com sua ajuda o processo está mais claro. Mas ainda fica a dúvida das questões acima. Independente de qualquer coisa vou fazer os testes com a sua orientação. Caso eu esteja enganado quanto ao local, por favor, avise-me.
Abraços!
Eduardo
Boa tarde,
Qual a definição do campo {total}?
Caro George, bom dia!
Vou colocar abaixo o comando SQL para que vc entenda melhor:
SELECT
COUNT(CD_REGATEND) AS total,
DATE(DATAREG) AS data_atend,
usuarioid,
HORA_INI,
HORA_FIM,
TEMPO_ATEND,
SUM(TIME_TO_SEC(TEMPO_ATEND)) AS tempo,
SIGLA_UNIDADE,
STATUS,
TIPO_DE_EQUIPAMENTO,
LOGIN_CLI,
CD_TIPO_PROBLEMA,
CD_DISU,
CD_SITUACAO,
PROBLEMA,
CD_REGATEND
FROM
REGATEND
GROUP BY CD_REGATEND, usuarioid
De certa forma o problema esta resolvido com a linha abaixo, aproveitei sua idéia e coloquei em uma linha, uma vez que a aplicação não aceitou a atribuição " $seconds = {tempo};" , e da forma que esta abaixo ficou realizando a transformação. Só falta colocar os zeros a esquerda para hora e para segundos.
{tempo} = floor({tempo}/3600).’:’.({tempo}-(floor(floor({tempo}/3600))*3600))/60;
Sua contribuição foi muito importante.
Obrigado!
Eduardo
Utilize
$seu_campo = str_pad( $seu_campo , 2, ‘0’, STR_PAD_LEFT );
Para colocar zeros a esquerda
Caro George, bom dia!
O comando final ficou:
{tempo} = str_pad(floor({tempo}/3600), 2, ‘0’, str_pad_left).’:’.str_pad(({tempo}-(floor(floor({tempo}/3600))*3600))/60, 2, ‘0’, str_pad_left);
E esta funcionando redondo.
A próxima etapa é colocar esse comando no campo que totaliza a soma.
Mais uma vez obrigado!
Eduardo
Bom dia Eduardo, estou com um problema parecido com o seu se não for o mesmo, poderia me ajudar? vc conseguiu colocar o resultado da soma na totalização da consulta?
Caros, eu teve esse problema também e resolvi o mesmo levando hora a segundos sempre, depois sumo os segundos e no momento de mostrar o total faço a conversão de total de segundo a hora em formato ##:##:##.
Eu uso Postgres 13 e todas minhas funções e regras de negocio ficam no banco de dados, se alguém tivesse inteires posso partilhar sem problemas.
Afonso2013, obrigado!
Eu uso o MYSQL tenho interesse em entender como vc fez na totalização para converter os segundo em hora e mostrar, eu convertir para segundos e agora o que eu faço?
Caro, eu fiz no Postgres uma função que entras a hora em formato ##:##:## e te devolve os segundos desde a media noite (Ex. 10:25:10 = 37510 segundos). Ao final sumo todos os segundos e depois tenho outra função que a partir dos segundos, qualquer valor devolve as horas a que corresponde em formato ##:##:##.
As funções são simples partindo do principio que cada minuto = 60 segundos e que cada hora tem 60 minutos.
Por exemplo: 23:59:59 = 86399 (um dia), e se a soma é equivalente a 125200 = 34:46:46
Nada mais, este é o procedimento, está feito em Postgres pois para mim programar em “plpgsql” é mais fácil que em PHP ou Javascript, alias sou também do critério que todo calculo ou quase todo deve ser feito em base de dados e não em APP