Utilizando horas e minutos para fazer calculos
Olá pessoal, vim escrever aqui hoje por que tive um problema enorme para fazer cálculos com horários. Um exemplo do que eu to falando é o seguinte: imaginem um colaborador, que recebe R$10,00 por hora. O mesmo colaborador faz 2 atividades, uma de 1h e 30m e outra de 45m. Assim ele tem ((2h e 15m) * R$10,00) para receber certo?
Uma formula que achei para resolver este problema, é converter os minutos em porcentagem, veja como é simples: 1,5 (1h 30m) + 0,75 (45m) = (2,25 * 10). Simples certo?
Bem, vou explicar mais ou menos como eu fiz para converter hora em percentagem. Primeiro, eu separei a parte inteira da parte decimal, fiz uma regra de 3 nas partes decimais, e somo com a parte inteira, simples! A transformação da porcentagem em horas eu fiz da seguinte forma: separei a parte inteira com a parte decimal, fiz uma regra de 3 com a parte decimal e JUNTEI com a parte inteira. Muito simples também
Para ficar claro para quem gosta de ver código, fiz um código em PHP para vocês verem. Espero que ajude =)
{
$hora_aux = explode(',', str_replace('.', ',', $hora));
return ($hora_aux[0] . '.' . ($hora_aux[1] * 100 / 60));
}
function porc2hora($hora)
{
$hora_aux = explode(',', number_format($hora, 2, ',', "));
$minutos = round($hora_aux[1] * 60 / 100);
$minutos = str_replace('.', ", $minutos);
return ($hora_aux[0] . '.' . $minutos);
}
Só para dar um gostinho, segue uma query que eu fiz em MySQL para fazer a conversão no proprio banco
SUM(T004.quantidade_porcentagem)
FROM
(SELECT
CONCAT(T003.hora_inteira, '.', (T003.hora_inteira * 100 / 60)) AS 'quantidade_porcentagem',
T003.*
FROM
(SELECT
(REPLACE(T002.quantidade_horas, ',', '.') – T002.hora_inteira) AS 'hora_decimal',
T002.*
FROM
(SELECT
IF(LOCATE(',', T001.quantidade_horas_porc) > 0,
SUBSTRING(T001.quantidade_horas_porc, 1, LOCATE(',', T001.quantidade_horas_porc) – 1),
T001.quantidade_horas_porc
) AS "hora_inteira",
T001.*
FROM
(SELECT
REPLACE(CAST(T000.quantidade_horas AS CHAR), '.', ',') AS 'quantidade_horas_porc',
T000.*
FROM
atividades T000
) AS T001
) AS T002
) T003
) T004,
fases_projetos T005
WHERE
T005.id_projeto = 43
AND
T004.id_fase_projeto = T005.id_fase_projeto
AND
T004.planejada = 'N'
AND
T005.contabilizar = 1
AND
T004.quantidade_porcentagem > 0