Ir para conteúdo

POWERED BY:

Arquivado

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

MarceloBezerra

Campo Time Maior que 838:59:59

Recommended Posts

Ola Galera,

 

Estou com um problema grave...

 

Tenho um programa em PHP que computa horas trabalhadas em uma obra. ou seja cada dia trabalhado tem 8 horas, porem se nessa obra trabalharem 10 técnicos no mesmo dia, as horas lançadas serão igual a 80 horas

Na soma de 1 mes de 22 dias uteis, a soma chegará a 1760 horas, porem o campo time (que eu acredito que é o mais adequado para esse calculo) só possibilita a inserção de 838:59:59. Menos da metade que eu preciso para lançar no mês.

 

Ha casos que na mesma obra é computada mais 10.000 horas.

 

Pergunta. tem como eu alterar o limite de valor desse campo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

e se voce lancar as horas separadamente para cada tecnico OU lancar as horas de cada dia, assumindo que o dia tenha no maximo 838.. horas, quando somado o de todos os tecnicos/funcionarios?

Compartilhar este post


Link para o post
Compartilhar em outros sites

...que eu acredito que é o mais adequado para esse calculo...

 

Não é.

Se você pretende armazenar apenas horas, acredito ser mais eficiente usar número inteiro e fazer os calculos adequados. Sem conhecer o negócio e a estrutura de dados não podemos ir muito além deste ponto.

 

Boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá a todos,

 

Pensando na sugestão do Prog, poderíamos utilizar a função

sec_to_time

, que converte inteiros em horas, porém, esbarramos novamente no limitador.

 

A saída seria calcular as horas na mão mesmo.

 

Abraços.

 

_ _

Fabiano Abreu

Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

só recompilando...

 

Uma vez eu tive um problema semelhante e usei bigint unsigned, que alegadamente tem um limite igual a :

9.223.372.036.854.775.807 (9 quintilhões) e salvava tudo em segundos, na hora de exibir eu convertia com sec_to_time como foi dito anteriormente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu galera pelas sugestões vou testar cada uma delas e postar . por hora eu fiz alguma cousa com números inteiros. ficou mais ou menos assim.

 

 

<?php
// vamos imaginar que eu recebi do form esse valor de horas previstas e grava em db.
$horatotal=6;
$Htm=$horatotal*60;

// recebi do form de horas trabalhadas o intervalo de horas que diminuindo um pelo outro cheguei a esse valor  


$hora="15:00";

$h=explode(":",$hora);
$Hm =   ($h[0]*60)+$h[1];
$Hmf=$Hm*0.55;

$Hsm =($Htm-$Hmf)/60;
echo "<br>";
$Msm=($Htm-$Hmf)%60;
setType ( $Hsm,"int");



$Hf=$Hmf/60;
setType ( $Hf,"int");
$Mf=$Hmf%60;
/* "Horas prevista :".$horatotal.":00";
"<br>";
"Horas Trabalhadas   :".$hora;
"Horas Computadas   : ".$hc;
"Saldo de horas          : ".$saldo */

echo $Hf.":".$Mf;
echo "<br>";
echo $Hsm.":".$Msm;

?>

// num teste grosseiro funcionou ainda não afinei o código por isso essa bagunça mas acredito que o caminho é esse como citou o colega "PROG", porem pretendo testar a solução apresentado pelo colega "giesta"

 

 

 

Até breve. com as novidades

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser criar uma função no MySQL, segue abaixo:

 

delimiter |

CREATE FUNCTION SEC_TO_TIME2 (in_seconds int)
RETURNS VARCHAR(16)
BEGIN
  DECLARE v_hour INT;
  DECLARE v_minute INT;
  DECLARE s_hour VARCHAR(10);
  DECLARE s_minute VARCHAR(2);
  DECLARE s_second VARCHAR(2);

  -- calculando tempo
  SET v_hour = FLOOR(in_seconds / 60 / 60);
  SET in_seconds = in_seconds - (v_hour * 60 * 60);

  SET v_minute = FLOOR(in_seconds / 60);
  SET in_seconds = in_seconds - (v_minute*60);

  -- formatando
  SET s_hour = IF (v_hour < 10,LPAD(v_hour,2,'0'),v_hour);
  SET s_minute = IF (v_minute < 10,LPAD(v_minute,2,'0'),v_minute);
  SET s_second = IF (in_seconds < 10,LPAD(in_seconds,2,'0'),in_seconds);

  RETURN CONCAT(s_hour,':',s_minute,':',s_second);
END

|

delimiter;

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.