Tonare 0 Denunciar post Postado Agosto 13, 2009 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
SetaMB 1 Denunciar post Postado Agosto 13, 2009 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
Alaerte Gabriel 662 Denunciar post Postado Agosto 13, 2009 Não entendi nada, poderia ser mais claro ? Compartilhar este post Link para o post Compartilhar em outros sites
Roberto_S_Luz 2 Denunciar post Postado Agosto 13, 2009 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
Roberto_S_Luz 2 Denunciar post Postado Agosto 13, 2009 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
Roberto_S_Luz 2 Denunciar post Postado Agosto 13, 2009 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
grabowski 0 Denunciar post Postado Novembro 7, 2012 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