Ontech Posted January 3, 2017 at 11:17 PM Report Share #601755 Posted January 3, 2017 at 11:17 PM Boas noites, Estou a desenvolver uma aplicação para marcação de aulas de grupo onde tenho guardadas apenas as horas no formato H:i, os dias de semana de 0 (Domingo) - 6 (Sabado) e o nome da aula. O que precisava era verificar as horas menor que 12:45 e maior que 12:45 para poder definir o tempo de antecedência para a marcação. Alguém já teve um problema idêntico? Obrigado Cumprimentos. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 3, 2017 at 11:19 PM Report Share #601756 Posted January 3, 2017 at 11:19 PM podes desenvolver o problema ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 3, 2017 at 11:34 PM Author Report Share #601765 Posted January 3, 2017 at 11:34 PM (edited) 15 minutos atrás, HappyHippyHippo disse: podes desenvolver o problema ? A nível de base de dados é o seguinte: Estou a utilizar o framework CodeIgniter e tenho o seguinte código: /*Tempo definido na configuração para poder fazer uma marcação nas aulas (48h)*/ $tempo_inscricao = 48 + 24; //Tempo de Inscrição //Data atual $inicio = new DateTime(); //Data final $fim = new DateTime(); $fim->modify('+' . $tempo_inscricao . ' hours'); //Intervalo de 1 Dia $interval = new DateInterval('P1D'); $periodo = new DatePeriod($inicio, $interval, $fim); $count = 0; //Percorrer a data foreach ($periodo as $data) { //Se for o próprio dia if ($count == 0) { echo 'Dia Atual: '; echo $data->format("w") . '<br>'; $hora = $data->format("H:i"); $this->db->select("Horario.id AS ID, Horario.dia_semana_id AS DIASEMANA, DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA, Horario.duracao AS DURACAO, Modalidades.nome AS MODALIDADE, Clubes.nome AS CLUBE"); $this->db->from('Horario'); $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner'); $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner'); $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner'); $this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')"); $this->db->where('Horario.dia_semana_id', $data->format('w')); $this->db->where('Clubes.id', 2); $this->db->where('Horario.estado', '1'); $resultado = $this->db->get()->result(); foreach ($resultado as $dados){ echo $dados->HORA.' - '.$dados->MODALIDADE.'<br>'; } echo '<hr>'; $count++; //Se não } else { $hora = $data->format("H:i"); $this->db->select("Horario.id AS ID, Horario.dia_semana_id AS DIASEMANA, DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA, Horario.duracao AS DURACAO, Modalidades.nome AS MODALIDADE, Clubes.nome AS CLUBE"); $this->db->from('Horario'); $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner'); $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner'); $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner'); //$this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')"); $this->db->where('Horario.dia_semana_id', $data->format('w')); $this->db->where('Clubes.id', 2); $this->db->where('Horario.estado', '1'); $resultado = $this->db->get()->result(); foreach ($resultado as $dados){ echo $dados->HORA.' - '.$dados->MODALIDADE.'<br>'; } //echo '<hr>'; //echo $data->format("w"); echo '<hr>'; } // Dia da Semana (0-Domingo 6-Sabado) } O que pretendia era comparar as horas ou seja: Para fazer uma marcação em uma aula até as 12:45 é necessário fazer com 12h de antecedência e para fazer a marcação em uma aula a partir de 12:45 é com 6h de antecedência. como defino essas 6h e essas 12h? Edited January 3, 2017 at 11:35 PM by Ontech Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 3, 2017 at 11:41 PM Report Share #601767 Posted January 3, 2017 at 11:41 PM novamente ... não foste claro o suficiente para da ruma resposta concreta ... queres obter registos da base de dados mediante uma regra ou o quê afinal ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 3, 2017 at 11:48 PM Author Report Share #601769 Posted January 3, 2017 at 11:48 PM 3 minutos atrás, HappyHippyHippo disse: novamente ... não foste claro o suficiente para da ruma resposta concreta ... queres obter registos da base de dados mediante uma regra ou o quê afinal ? Quero criar uma regra que me devolva as aulas que posso fazer a marcação com estas regras: Para fazer uma marcação em uma aula até as 12:45 é necessário fazer com 12h de antecedência e para fazer a marcação em uma aula a partir de 12:45 é com 6h de antecedência. para poder por um botão de marcação na pagina. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 4, 2017 at 12:01 AM Report Share #601771 Posted January 4, 2017 at 12:01 AM porque é que a hora não é um campo do tipo time ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 4, 2017 at 12:12 AM Author Report Share #601772 Posted January 4, 2017 at 12:12 AM 7 minutos atrás, HappyHippyHippo disse: porque é que a hora não é um campo do tipo time ? Boa pergunta, já alterei o campo, há algum comando SQL que faça essa diferença? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 4, 2017 at 12:18 AM Report Share #601773 Posted January 4, 2017 at 12:18 AM vou-te dar um exemplo e tu aplicas ao teu código SELECT * FROM tabela WHERE DATE_SUB(tabela.campo, 12. HOUR) > CURDATE() este código selecciona todos os registos tais que a data do campo 'campo' é mais do que a data actual mais 12 horas IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 5, 2017 at 12:07 PM Author Report Share #601802 Posted January 5, 2017 at 12:07 PM Penso que não fui claro o suficiente, vou tentar explicar de uma melhor forma: Eu tenho a tabela horario que pretende ao qual o objetivo é criar o horario das aulas de grupo de um ginásio sendo que os campos que mais se evidenciam são: dia_semana_id - Este varia de 0 - Domingo a 6 - Sábado. clube_modalidade_id - Indica a modalidade e o clube a que pertence. hora - Indica a hora do inicio da aula de grupo O Que pretendo é que a partir da data atual e num período definido pelo "administrador" que ficará numa tabela configurações a função me devolva as aulas a que é possível efectuar a marcação tendo em conta o seguinte: As aulas que estejam na tabela horario com uma data inferior ou igual a 12:45 para ser marcadas precisam de ser marcadas com 12h de antecedência e as restantes com 6h de antecedência. Eu criei a seguinte função que me mostra as aulas neste caso num período de 48h definido na variável $tempo_inscricao. /*Tempo definido na configuração para poder fazer uma marcação nas aulas (48h)*/ $tempo_inscricao = 48 + 24; //Tempo de Inscrição //Data atual $inicio = new DateTime(); //Data final $fim = new DateTime(); $fim->modify('+' . $tempo_inscricao . ' hours'); //Intervalo de 1 Dia $interval = new DateInterval('P1D'); $periodo = new DatePeriod($inicio, $interval, $fim); $count = 0; //Percorrer a data foreach ($periodo as $data) { $data1 = $data; $data->format('Y-m-d H:i w').'<br>'; //Se for o próprio dia if ($count == 0) { echo 'Dia Atual: '; echo $data->format("w") . '<br>'; $hora = $data->format("H:i"); $this->db->select("Horario.id AS ID, Horario.dia_semana_id AS DIASEMANA, DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA, Horario.duracao AS DURACAO, Modalidades.nome AS MODALIDADE, Clubes.nome AS CLUBE"); $this->db->from('Horario'); $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner'); $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner'); $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner'); $this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')"); $this->db->where('Horario.dia_semana_id', $data->format('w')); $this->db->where('Clubes.id', 2); $this->db->where('Horario.estado', '1'); $resultado = $this->db->get()->result(); foreach ($resultado as $dados){ //echo $dados->HORA.' - '.$dados->MODALIDADE.'<br>'; $teste = str_replace(':', '', $dados->HORA); var_dump($data1); if($teste <= 1245){ //Verificar as 12 h }else{ // Verificar 6H } } echo '<hr>'; $count++; //Se não } else { $hora = $data->format("H:i"); $this->db->select("Horario.id AS ID, Horario.dia_semana_id AS DIASEMANA, DATE_FORMAT(STR_TO_DATE(Horario.hora,'%H:%i'),'%H:%i') AS HORA, Horario.duracao AS DURACAO, Modalidades.nome AS MODALIDADE, Clubes.nome AS CLUBE"); $this->db->from('Horario'); $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner'); $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner'); $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner'); //$this->db->where("HORA>DATE_FORMAT(STR_TO_DATE('$hora','%H:%i'), '%H:%i')"); $this->db->where('Horario.dia_semana_id', $data->format('w')); $this->db->where('Clubes.id', 2); $this->db->where('Horario.estado', '1'); $resultado = $this->db->get()->result(); foreach ($resultado as $dados){ $teste = str_replace(':', '', $dados->HORA); if($teste <= 1245){ echo 'Dados Inferiores a ou iguais a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>'; }else{ echo 'Dados Superiores a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>'; } } //echo '<hr>'; //echo $data->format("w"); echo '<hr>'; } // Dia da Semana (0-Domingo 6-Sabado) } Resolvi o problema para verificar se a hora era superior ou nao a 12:45 da seguinte forma: $teste = str_replace(':', '', $dados->HORA); if($teste <= 1245){ echo 'Dados Inferiores a ou iguais a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>'; }else{ echo 'Dados Superiores a 12:45:'. $dados->HORA.' - '.$dados->MODALIDADE. '-'.$teste.'<br>'; } O que precisava agora era fazer uma comparação da hora atual com a que se encontra na tabela horários e permitir ou não a inscrição. Ou uma melhor sugestão a nível de implementação de horários e inscrições... Obrigado Cumprimentos Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 5, 2017 at 12:32 PM Report Share #601803 Posted January 5, 2017 at 12:32 PM (edited) continuas a não ser específico o suficiente. pretendes ter uma solução ao nível do SQL, seja ele por filtragem dos horários ou marcação destes da possibilidade de agendamento, ou queres uma solução ao nível do PHP que irá analisar o registo ? ps : suponho que seja o último, mas como estás sempre a falar do SQL ... Edited January 5, 2017 at 12:33 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 5, 2017 at 12:50 PM Author Report Share #601804 Posted January 5, 2017 at 12:50 PM Agora, HappyHippyHippo disse: continuas a não ser específico o suficiente. pretendes ter uma solução ao nível do SQL, seja ele por filtragem dos horários ou marcação destes da possibilidade de agendamento, ou queres uma solução ao nível do PHP que irá analisar o registo ? Pretendo uma solução a nivel de PHP, uma vez que o horário é baseado nos dias de semana e não em uma data especifica. Sendo calculadas as datas disponiveis através do php. Ou seja um exemplo prático: Tenho na tabela horario o seguinte registo: id: 1 dia_semana_id: 5 (Sexta-feira) hora: 11:45 modalidade: WOD Quero que a função pegue no dia de atual verifique se a aula está dentro do tempo de marcação por exemplo 48h, verifique se a hora da aula é inferior ou igual a 12:45 para ser definido o tempo de antecedência de marcação. No exemplo do registo acima o tempo de antecedência é de 12h porque 11:45 é menor ou igual a 12:45 iria comparar o dia e hora atual com o de amanhã (Sexta Feira - 5) e se for superior a 12h devolve que é possivel senão impossivel de fazer a marcação. Consegui ser um pouco mais especifico? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 5, 2017 at 03:35 PM Report Share #601810 Posted January 5, 2017 at 03:35 PM antes de dar a solução ... podes-me dizer o que diferencia uma horário desta sexta-feira com um horário da próxima sexta-feira ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 5, 2017 at 03:39 PM Author Report Share #601812 Posted January 5, 2017 at 03:39 PM 2 minutos atrás, HappyHippyHippo disse: antes de dar a solução ... podes-me dizer o que diferencia uma horário desta sexta-feira com um horário da próxima sexta-feira ? A diferença é nenhuma é só a data e não é possível fazer a inscrição nessa aula porque desde o dia de hoje até a próxima sexta-feira ultrapassa as 48h do tempo de possível para a marcação. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 5, 2017 at 03:54 PM Report Share #601816 Posted January 5, 2017 at 03:54 PM agora vira isso ao contrário coo defines que um registo existente na base de dados é desta sexta-feira ou foi da sexta-feira passada ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 5, 2017 at 03:58 PM Author Report Share #601817 Posted January 5, 2017 at 03:58 PM Agora, HappyHippyHippo disse: agora vira isso ao contrário coo defines que um registo existente na base de dados é desta sexta-feira ou foi da sexta-feira passada ? Quando a pessoa faz a marcação é guardada a data do dia exacto da marcação num campo data que ainda não coloquei na tabela Marcações. Isto ira permitir listar as pessoas inscritas em uma determinada data e aula que pertencerá a tabela horário. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 5, 2017 at 05:11 PM Report Share #601818 Posted January 5, 2017 at 05:11 PM ok, agora que sei que sabes que existe esse pequeno senão no ambiente apresentado anteriormente, o que tens de fazer em PHP, será algo deste género: <?php function getRecordTime($weekday, $rectime) { list($hours, $minutes) = explode(':', $rectime); $time = $hours * 3600 + $minutes * 60; $dayinc = 0; if (date('N') != $weekday) { switch ($weekday) { case 1: $dayname = 'Monday'; break; case 2: $dayname = 'Tuesday'; break; case 3: $dayname = 'Wednesday'; break; case 4: $dayname = 'Thursday'; break; case 5: $dayname = 'Friday'; break; case 6: $dayname = 'Saturday'; break; case 7: $dayname = 'Sunday'; break; } $day = strtotime('next ' . $dayname); } else $day = strtotime('today'); return $day + $time; } function getRecordLimits($time, $rectime) { list($hours, $minutes) = explode(':', $rectime); $threshold = $hours > 12 || $hours == 12 && $minutes > 45 ? 6 : 12; $date = date("Y-m-d H:i:s", $time); return [strtotime($date . ' - 48 hours'), strtotime($date . ' - ' . $threshold . ' hours')]; } $now = strtotime('now'); foreach ($resultado as $dados){ list($limit_inf, $limit_sup) = getRecordLimits(getRecordTime($dados->DIASEMANA, $dados->HORA), $dados->HORA); if ($limit_inf <= $now && $limit_sup >= $now) { // ok ... eu posso fazer a marcação } } 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Ontech Posted January 6, 2017 at 01:09 AM Author Report Share #601829 Posted January 6, 2017 at 01:09 AM Muito obrigado pela sua disponibilidade e ajuda, agora já consegui todas as aulas às quais me posso inscrever dentro daqueles limites, como contribuição, aqui está a forma a funcionar com o Codeigniter 3: helpers/marcacao_helper.php function getRecordTime($weekday, $rectime) { list($hours, $minutes) = explode(':', $rectime); $time = $hours * 3600 + $minutes * 60; if (date('N') != $weekday) { switch ($weekday) { case 1: $dayname = 'Monday'; break; case 2: $dayname = 'Tuesday'; break; case 3: $dayname = 'Wednesday'; break; case 4: $dayname = 'Thursday'; break; case 5: $dayname = 'Friday'; break; case 6: $dayname = 'Saturday'; break; case 7: $dayname = 'Sunday'; break; } $day = strtotime('next ' . $dayname); } else { $day = strtotime('today'); } return $day + $time; } function getRecordLimits($time, $rectime) { list($hours, $minutes) = explode(':', $rectime); $threshold = $hours > 12 || $hours == 12 && $minutes > 45 ? 6 : 12; $date = date("Y-m-d H:i:s", $time); return [strtotime($date . ' - 48 hours'), strtotime($date . ' - ' . $threshold . ' hours')]; } No Controller: public function aulasDisponiveisMarcacao() { $this->db->select("Horario.id AS ID, Horario.dia_semana_id AS DIASEMANA, Horario.hora AS HORA, Horario.duracao AS DURACAO, Modalidades.nome AS MODALIDADE, Clubes.nome AS CLUBE"); $this->db->from('Horario'); $this->db->join('ClubeModalidades', 'Horario.clube_modalidade_id = ClubeModalidades.id', 'inner'); $this->db->join('Modalidades', 'ClubeModalidades.modalidade_id = Modalidades.id', 'inner'); $this->db->join('Clubes', 'ClubeModalidades.clube_id = Clubes.id', 'inner'); $this->db->where('Clubes.id', 2); $this->db->where('Horario.estado', '1'); $this->db->order_by('Horario.dia_semana_id, HORA', 'asc'); $resultado = $this->db->get()->result(); $this->load->helper('marcacao'); $now = strtotime('now'); foreach ($resultado as $dados) { list($limit_inf, $limit_sup) = getRecordLimits(getRecordTime($dados->DIASEMANA, $dados->HORA), $dados->HORA); if ($limit_inf <= $now && $limit_sup >= $now) { echo 'Pode inscrever-se na aula de: ' . $dados->MODALIDADE . '. na data ' . date('d-m-Y', getRecordTime($dados->DIASEMANA, $dados->HORA)) . ' às ' . $dados->HORA; echo '<hr>'; } } } Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now