Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

Lógica para verificar se horário está vago

Recommended Posts

Fala galera,

 

Tenho o seguinte caso: Uma agenda que controla a reserva de salas de reuniões. Preciso de uma validação para verificar se o horário escolhido já está sendo utilizado. Porém, não posso usar uma comparação simples, pois as reservas podem ser por períodos diferentes (1h, 2h, 3h, etc...)

 

Por exemplo:

 

 

Reunião 01:

Inicio: 2016-05-02 17:00:00
Fim: 2016-05-02 18:00:00
Reunião 02:
Inicio: 2016-05-03 13:00:00
Fim: 2016-05-03 15:00:00

 

 

Como posso validar para que uma possível Reunião 03 entre estes horários não seja cadastrada?

// * Verifica se tem reunião agendada no horário
if(){ // * Aqui é a dúvida.
	$liberado = true;
}
else{
	$liberado = false;
}

// * Se o horario estiver liberado
if($liberado){
	// * Rotina de cadastro
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você terá que fazer cálculos entre às datas e horários, para isso você vai utilizar a class

DateTime()

http://php.net/manual/pt_BR/class.datetime.php

 

Você terá que pegar qual o tempo da reunião, se por exemplo escolhida por 1 hora, então você deverá fazer a soma de 1 hora na data e horário escolhido, o lance é retirar essa data e hora durante o horário de execução entendeu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei nisso também.

 

Mas acho que eu teria um problema, caso eu marcasse uma reunião por exemplo, uma hora mais cedo e terminasse no meio dela... ou iniciasse 1h antes e terminasse 1h depois da reunião marcada, dando um problema danado.

 

Consegui uma solução usando MySQL BETWEEN, que contornaria esse problema, de ter algum horário conflitante:

WHERE (dataInicio BETWEEN '".$dataInicio."' AND '".$dataTermino."')
OR (dataTermino BETWEEN '".$dataInicio."' AND '".$dataTermino."')
OR ('".$dataInicio."' BETWEEN dataInicio AND dataTermino)
OR ('".$dataTermino."' BETWEEN dataInicio AND dataTermino)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há outra lógica com uma complexidade ciclomática menor.

':dataInicio BETWEEN dataInicio AND dataTermino
OR :dataFim BETWEEN dataInicio AND dataTermino
OR (
    :dataInicio <= dataInicio 
    AND :dataFim >= dataTermino
)'
Data de início ou de término no meio de algum perído ou data de início menor e data de início maior que o período.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gabriel o que seria o : que está antes de alguns nomes das colunas?

 

Disfarça, acho que entendi. Seria algo relacionado às variaveis no PHP, certo? Não teria a ver com o MySQL em si, hahah.

Compartilhar este post


Link para o post
Compartilhar em outros sites

São placeholders para prepared statements. Também são conhecido como bind variables.

 

Apesar de, no nosso caso, ser mais utilizado na PDO, são funcionalidades do próprio SGBD.

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.