Soma de campo time

(eduardolima) #1

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.

(George Carvalho) #2

E sua dificuldade esta onde?

Em calcular?

Por no relatório?

(eduardolima) #3
      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

(George Carvalho) #4

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;

(eduardolima) #5

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

(George Carvalho) #6

Boa tarde,

Qual a definição do campo {total}?

(eduardolima) #7

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

(George Carvalho) #8

Utilize

$seu_campo = str_pad( $seu_campo , 2, ‘0’, STR_PAD_LEFT );

Para colocar zeros a esquerda

http://php.net/manual/pt_BR/function.str-pad.php

(eduardolima) #9

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