calcular horas

Peço ajuda como devo solucionar o seguinte caso: O código abaixo calcula as horas trabalhadas. Preciso colocar isso numa aplicação no SC que possui dois campos, hora início e hora término com mysql e mostre o resultado na própria aplicação.

<?php function SubtraiHorario($HoraInicial,$HoraFinal) { $MinutosIniciais = split(':',$HoraInicial); $TempoInicial = ($MinutosIniciais[0]*60) + $MinutosIniciai [1] ; $MinutosFinais = split(':',$HoraFinal); $TempoFinal = ($MinutosFinais[0]*60) + $MinutosFinais[1] ; $TotalMinutos = ($TempoFinal - $TempoInicial); $NHoras = floor($TotalMinutos/60); $NMinutos = ($TotalMinutos%60); if(strlen($NMinutos) != 2 ) $NMinutos = $NMinutos."0"; return $NHoras.':'.$NMinutos; } echo SubtraiHorario('09:00','10:00'); ?>

resultado na tela = 1:00

Utilize os metodos do Scriptcase.

Muito obrigado pela atenção.
Desculpem o abuso de pedir um exemplo de como fazer na prática a solução sugerida.

estou com um problema parecido, também quero calcular horas trabalhadas, no mysql guardo hora inicial e hora final, mas no SC nao tem macro para calculo de horas só de datas, no meu caso estou tentando usar uma função do php mktime!

Não Sei se vai ajudar mas vou mandar esta função que vocês poderão colocar no comando afterupdate:

os campos datai e dataf são do tipo: “data e hora”

//{datai} = data inicial
//{dataf} = data final
//{resultado} = campo que receberá o resultado

function Difer_horas($hora1,$hora2){
$entrada = {datai};
$saida = {dataf};
$hora1 = explode(":",$entrada);
$hora2 = explode(":",$saida);
$acumulador1 = ($hora1[0] * 3600) + ($hora1[1] * 60) + $hora1[2];
$acumulador2 = ($hora2[0] * 3600) + ($hora2[1] * 60) + $hora2[2];
$resultado = $acumulador2 - $acumulador1;
$hora_ponto = floor($resultado / 3600);
$resultado = $resultado - ($hora_ponto * 3600);
$min_ponto = floor($resultado / 60);
$resultado = $resultado - ($min_ponto * 60);
$secs_ponto = $resultado;
return $hora_ponto.":".$min_ponto.":".$secs_ponto;
}

$final = Difer_horas();

{resultado} = $final;

neste exemplo é para os que usam data e hora em campos diferentes… falta associar


//$hota1 = {horai}
//$data1 = {datai}


function tempo($data1,$hora1,$data2,$hora2){

$i = split(":",$hora1);
$j = split("-",$data1);
$k = split(":",$hora2);
$l = split("-",$data2);

$tempo1 = mktime($i[0],$i[1],$i[2],$j[1],$j[2],$j[0]);
$tempo2 = mktime($k[0],$k[1],$k[2],$l[1],$l[2],$l[0]);

$calculo = ceil((($tempo2 - $tempo1)/60)/60);
$tempo["hora_total"] = $calculo;
$tempo["anos"] = ($calculo-($calculo%(365*24)))/(365*24);
$calculo = ($calculo%(365*24));
$tempo["meses"] = ($calculo-($calculo%(30*24)))/(30*24);
$calculo = ($calculo%(30*24));
$tempo["semanas"] = ($calculo-($calculo%(7*24)))/(7*24);
$calculo = ($calculo%(7*24));
$tempo["dias"] = ($calculo-($calculo%24))/24;
$calculo = ($calculo%24);
$tempo["horas"] = $calculo;

return $tempo;

}

$final = tempo();

echo $final;

Ainda não tinha visto esta resposta, fiz algo muito semelhante, mas ainda sim essa solução funciona, pois, a que eu fiz funcionou.

Boa tarde

algum poderia me ajudar

tenho o seguinte

08:00 12:00 13:00 18:00 = 08:00
preciso fazer esse calculo algume poderia me ajudar pois sou ainda iniciante na ferramenta;

Essas horas são retornadas pelo MYSQL?

As horas são retornadas pelo MYSQL?

Se for é so executar no onRecord, o sc_lookup, fazendo query da data final menos a data inicial

nem tudo tem que ser resolvido pelo php, essa funcao de hora o banco mysql resolve

crie um metodo php com o nome diferenca_time com o script abaixo:

$hora_inicial={campo_hora_inicial};
$hora_final={campo_hora_final};

sc_lookup(dataset,“SELECT TIMEDIFF(’$hora_inicial’,’$hora_final’)”);
if(!empty({dataset})){
{diferenca_hora} = {dataset}[0][0];
}

fassa a chamada do metodo php no onRecord
diferenca_time();

Arquimedes, mas e se for em um form? Não tem OnRecord.

Pessoal segue uma atualização pois para mim o que foi sugerido não funcionou então tive que refazer boa parte.
Inclui alguns comentários para calcular os SEGUNDOS pois para mim não era necessário.

Optei por não fazer via BANCO DE DADOS para ser menos um fator de carga de tráfego de rede.

function Difer_horas($hora1,$hora2) {
$inicio = $hora1; // {dta_hra_inicio}; // inicio
$fim = $hora2; // {dta_hra_fim}; // fim

$data_hora_ini = explode(" “,$inicio); // inicio
$data_hora_fim = explode(” ",$fim); // fim

$data_ini = explode("-",$data_hora_ini[0]);
$data_fim = explode("-",$data_hora_fim[0]);

$hora_ini = explode(":",$data_hora_ini[1]);
$hora_fim = explode(":",$data_hora_fim[1]);

$acumulador_ini = ($hora_ini[0] * 3600) + ($hora_ini[1] * 60) + $hora_ini[2]; // inicio
$acumulador_fim = ($hora_fim[0] * 3600) + ($hora_fim[1] * 60) + $hora_fim[2]; // fim

$resultado = $acumulador_fim - $acumulador_ini;

$hora_ponto = floor($resultado / 3600);
$resultado = $resultado - ($hora_ponto * 3600);
$min_ponto = floor($resultado / 60);
//$resultado = $resultado - ($min_ponto * 60); // segundos
$secs_ponto = $resultado;
// return $hora_ponto.":".$min_ponto.":".$secs_ponto;
//{duracao_atend} = $hora_ponto.":".$min_ponto.":".$secs_ponto;

$resultado = $hora_ponto.":".$min_ponto;

// echo $resultado;
return $resultado;
// Adaptado de:
// http://www.scriptcase.com.br/forum/index.php?action=post;quote=1622;topic=564.0;last_msg=41188

}

Muito bom.
Obrigado por compartilhar.

Povo…só pra complementar essa dica que me ajudou:

Minha necessidade era acumular horas.
nesse caso tenho um detalhe que quando o resultado dos minutos é menor que 10, por exemplo: 12:06 o valor saia 12:6, entao fiz uma pequena modificação para acrescentar o “zero”, saindo 12:06.

[code]$hora1 = ‘12:06’;
$hora2 = ‘14:00’;

//SOMAR HORAS
$inicio = $hora1; // {dta_hra_inicio}; // inicio
$fim = $hora2; // {dta_hra_fim}; // fim

$hora_ini = explode(":",$inicio);
$hora_fim = explode(":",$fim);

$acumulador_ini = ($hora_ini[0] * 3600) + ($hora_ini[1] * 60); // inicio
$acumulador_fim = ($hora_fim[0] * 3600) + ($hora_fim[1] * 60); // fim

$resultado = $acumulador_fim + $acumulador_ini;

$hora_ponto = floor($resultado / 3600);
$resultado = $resultado - ($hora_ponto * 3600);
$min_ponto = floor($resultado / 60);
if($min_ponto < 10){

$min_ponto = str_pad($min_ponto, 2, '0', STR_PAD_LEFT);

}

echo $resultado = $hora_ponto.":".$min_ponto; [/code]