Jump to content

Recommended Posts

Posted

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

Posted

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
Posted

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.

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.