Saddam Posted June 4, 2014 at 11:37 AM Report #558185 Posted June 4, 2014 at 11:37 AM Boa tarde pessoal, estou a desenvolver uma aplicação para reserva de salas, tenho uma tabela onde guardo todas as salas alugadas, com a Data , a Hora de Inicio e a Hora Fim. Quando faço um novo aluguer preciso de verificar se já se encontra alguma sala alugada no intervalo de tempo indicado. Só que tenho um problema, se a hora fim duma sala for 20, e eu quero reservar uma sala das 20 as 22, a query devolve-me que no intervalo de tempo ja tenho uma sala reservada. A minha query: $checkH = mysql_query("SELECT * FROM reservasala WHERE idSala='$sala' AND data='$dataR' AND ((h_inicio between '$h_in' and '$h_fim') OR (h_fim between '$h_in' and '$h_fim'))"); Alguma dica para resolver este problema ? Obrigado
HappyHippyHippo Posted June 4, 2014 at 11:51 AM Report #558187 Posted June 4, 2014 at 11:51 AM Alguma dica para resolver este problema ? Obrigado sim, não uses o between ... $checkH = mysql_query(" SELECT * FROM reservasala WHERE idSala='$sala' AND data='$dataR' AND ( h_inicio >= '$h_in' AND h_inicio < '$h_fim') OR ( h_fim > '$h_in' AND h_fim <= '$h_fim') "); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted June 5, 2014 at 11:42 PM Report #558409 Posted June 5, 2014 at 11:42 PM Essa expressão está mesmo correcta? Da última vez que me deparei com um problema semelhante, cheguei à expressão de detecção de colisões '$h_fim' > h_inicio AND '$h_in' < h_fim (isto não considerando a data, e ignorando o detalhe do >/>=). A ideia é que se '$h_fim' < h_inicio (a nova reserva termina antes da outra começar) não há colisão. O mesmo se aplica caso '$h_in' > h_fim. É só negar esta condições para obtermos uma expressão simples para as colisões. Estava aqui a tentar chegar à expressão (h_inicio >= '$h_in' AND h_inicio < '$h_fim') OR (h_fim > '$h_in' AND h_fim <= '$h_fim') a partir da minha, mas não consegui. Assim à primeira vista, esta expressão implica que h_inicio > '$h_in' OR h_fim < '$h_fim' seja verdadeiro (para além das condições impostas pela minha expressão). Isto significa que esta expressão não detecta colisões, por exemplo, no caso de haver uma reserva das 19 às 23, e se estar a tentar reservar a sala para as 20-22. Rui Carlos Gonçalves
HappyHippyHippo Posted June 6, 2014 at 06:58 AM Report #558417 Posted June 6, 2014 at 06:58 AM Essa expressão está mesmo correcta? Da última vez que me deparei com um problema semelhante, cheguei à expressão de detecção de colisões '$h_fim' > h_inicio AND '$h_in' < h_fim (isto não considerando a data, e ignorando o detalhe do >/>=). A ideia é que se '$h_fim' < h_inicio (a nova reserva termina antes da outra começar) não há colisão. O mesmo se aplica caso '$h_in' > h_fim. É só negar esta condições para obtermos uma expressão simples para as colisões. Estava aqui a tentar chegar à expressão (h_inicio >= '$h_in' AND h_inicio < '$h_fim') OR (h_fim > '$h_in' AND h_fim <= '$h_fim') a partir da minha, mas não consegui. Assim à primeira vista, esta expressão implica que h_inicio > '$h_in' OR h_fim < '$h_fim' seja verdadeiro (para além das condições impostas pela minha expressão). Isto significa que esta expressão não detecta colisões, por exemplo, no caso de haver uma reserva das 19 às 23, e se estar a tentar reservar a sala para as 20-22. quando fiz a conversão nem olhei para a detecção das colisões de datas. foi somente tirar os betweens olhando bem, sim, para detectar colisões seria somente: $checkH = mysql_query(" SELECT * FROM reservasala WHERE idSala='$sala' AND data='$dataR' AND h_inicio < '$h_fim' AND h_fim > '$h_in' "); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
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