Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
>
...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.
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
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
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
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);|
delimiter;
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?