Ir para conteúdo

POWERED BY:

Arquivado

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

Tonare

Cálculo de horas úteis em um período

Recommended Posts

Ola Pessoal,

Preciso mais uma vez de uma ajuda de vocês pois não encontrei nada similar...

 

Alguém tem algum script que calcule o total de horas úteis entre um período?

 

Por exemplo, horas úteis entre 10/01/2009 12:00:00 e 12/01/2009 15:30, considerando que o período útil é entre 08:00 e 18:00.

 

Dia 10/01 = 12:00->18:00 == 6:00

Dia 11/01 = 08:00->18:00 == 10:00

Dia 12/01 = 08:00->15:30 == 7:30

Total ===================== 23:30 horas de trabalho.

 

Agradeço desde já a ajuda de vocês!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Tonare, beleza?

 

Cara, a função date() te retorna no dia da semana em nome ou número

 

Exemplo:

 

print date("l m/Y"); // retorna "Thursday 08/2009"
print date("N m/Y"); // retorna "4 08/2009"

Aí é só você verificar os dias que você passou e ver se são dias úteis e somar o número de horas.

 

Qualquer coisa grita ae....

 

Abraço, Seta

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Tonare beleza???

Eu fiz um controle de hora extra a algum tempo atraz que é meio similiar ao que você quer.

 

Bom...valos lá,deixa eu ver se ainda me lembro.

 

Vamos supor que você quer calcular o total de horas entre 08:00 às 18:00, bom...nota-se que são 10 horas né, mais como calcular isso?

 

Bem... você pode fazer os seguinte:

 


echo "<br>Calculando o total de horas entre um intervalos de horas";
function converterHora($total_segundos){
			
			$hora = floor($total_segundos / (60*60));
			$total_segundos = ($total_segundos % (60*60));
			
			$minuto = floor ($total_segundos / 60 );
			$total_segundos = ($total_segundos % 60);
			
			$hora_minuto = $hora.":".$minuto;
			return $hora_minuto;
		}
echo "<br><br>Hora Inical = ".$hora1 = '08:00';
echo "<br>Hora Inical = ".$hora2 = '18:00';

$hora_inical = strtotime($hora1);
$hora_final = strtotime($hora2);

echo "<br><br>Total segundos = ".$total_horas  = $hora_final - $hora_inical;
echo "<br><br>Divide o valor obtido que foi 36000 segundos e divide pelo total de segundos existentes em 1 hora que é 3600 segundos";
echo "<br><br>Total de Horas = ".$horas = converterHora($total_horas);



Bom... ver se te serve em algo aí, qualquer coisa, vai postando suas duvidas aí ok. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Abraços amigo!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahh sim, esqueci de dizer.

 

caso você deseje descontar a hora do almoço

echo "<br><br>Caso deseje subtrair com uma hora por exemplo...do almoço, vamos supor que são 2 horas (ou 7200 segundos)pro almoço";

echo "<br><br>Hora do Almoço = 02 horas ou  ".$hora_almoco = 7200;
$almoco = $total_horas - $hora_almoco;


echo "<br><br>Total de horas Trabalhadas = ".$hora_liquida = converterHora($almoco);

Abraços!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais outra coisa,você pode está gravando o total de segundos de cada dia, isso facilitará na hora que for realizar uma consulta.

 

Daí você pode fazer a consulta pelo um intervalo de datas consultando o total de segundos acumulados de cada dia e somando-os daí você converte em horas, por exemplo:

 

Entre 01/08/2009 às 31/08/2009.

(É apenas um exemplo, você terá que aperfeiçoar ok http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif)

       $sql = 'SELECT SUM(TOTAL_SEGUNDOS) AS TOTAL_SEGUNDOS FROM HORAS WHERE BETWEEN "01/08/2009" and "31/08/2009"';
       $consultar = $conectar->consultar($sql);
       $retorno = mysql_fetch_assoc($consultar);
       
       $total_sugundos = $retorno["TOTAL_SEGUNDOS"];
       $total_horas = converterHora($Total_segundos);

Bom...esse codigo acima eu não o testei mais..a logica é marromeno isso aí ok http://forum.imasters.com.br/public/style_emoticons/default/clap.gif .

 

Qualquer dúvida...posta aí beleza.

 

Flw, boa sorte!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala moçada.

 

Fiz uma função no MySQL que resolve esta bronca:

 

Duvidas me procurem abraço.

 

DELIMITER $$

DROP FUNCTION IF EXISTS `database`.`getHorasDiferenca` $$
CREATE DEFINER=``@`` FUNCTION `horasDiferenca`(dataInicial DATETIME) RETURNS TIME
   DETERMINISTIC
BEGIN

DECLARE tempoFinal   INT;
DECLARE tempoDiario  INT;
DECLARE totalDias    INT;
DECLARE contador     INT;
DECLARE diaSemana    INT;
DECLARE dataAnterior DATETIME;
DECLARE dataProxima  DATETIME;
DECLARE retorno      TIME;

SET contador = 0;
SET tempoFinal = 0;

SELECT -- select utilizado para ajustar a data inicial caso ela esteja fora do horário comercial
CASE
  WHEN (dataInicial < DATE_FORMAT(dataInicial, '%Y-%m-%d 08:12:00') ) THEN DATE_FORMAT(dataInicial, '%Y-%m-%d 08:12:00')
  WHEN (dataInicial > DATE_FORMAT(dataInicial, '%Y-%m-%d 18:00:00') ) THEN DATE_FORMAT(dataInicial, '%Y-%m-%d 18:00:00')
  ELSE dataInicial
END INTO dataInicial;

-- Total de dias no periodo
SELECT DATEDIFF(NOW(), dataInicial) INTO totalDias;

WHILE contador <= totalDias DO

IF (contador = 0) THEN
  SET dataProxima = dataInicial; -- iguala as datas
ELSE
  SELECT DATE_ADD(dataInicial, INTERVAL + contador DAY) INTO dataProxima; -- adiciona um dia na data
END IF;


SELECT WEEKDAY(dataProxima) INTO diaSemana; -- captura o indice do dia da semana


IF(diaSemana <> 6 AND diaSemana <> 5) THEN --    6 DOMINGO     5 SABADO -- Nao contabilizar Domingo e Sabado

   IF(contador = 0 AND contador <> totalDias) THEN
     SELECT TIME_TO_SEC(TIMEDIFF(DATE_FORMAT(dataProxima,'%Y-%m-%d 18:00:00'),dataProxima)) INTO tempoDiario;

   ELSEIF(contador = 0 AND contador = totalDias) THEN
     SELECT TIME_TO_SEC(TIMEDIFF(NOW(),dataProxima)) INTO tempoDiario;

   ELSEIF(contador = totalDias) THEN
     SELECT TIME_TO_SEC(TIMEDIFF(NOW(),DATE_FORMAT(dataProxima,'%Y-%m-%d 08:12:00'))) INTO tempoDiario;

   ELSE
     SELECT TIME_TO_SEC(TIMEDIFF(DATE_FORMAT(dataProxima,'%Y-%m-%d 18:00:00'),DATE_FORMAT(dataProxima,'%Y-%m-%d 08:12:00'))) INTO tempoDiario;

   END IF;

   SET tempoFinal = tempoFinal + tempoDiario;

END IF;

SET contador = contador+1;

END WHILE;

SELECT SEC_TO_TIME(tempoFinal) INTO retorno;
RETURN retorno;

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.