[MySQL] Verifica disponibilità camera

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
nel mio db le date sono rovesciate,
prova in questo modo
ciao
Marino
Codice:
SELECT * from stanze 
WHERE NOT EXISTS
(
SELECT stanza_id 
FROM prenotazioni
WHERE
(
( datain >= $datain AND datain <= $dataout ) 
OR
( dataout >= $datain AND dataout <= $dataout ) 
)
AND stanza_id=stanze.stanza_id
)
 

lorenzo84

Utente Attivo
22 Lug 2012
236
0
16
Adesso sembra funzionare ma rimane il problema che se ho tutte le stanze occupate dal 10/10/2014 al 12/10/2014 e volessi prenotare dal 08/10/2014 al 15/10/2014 lui mi da tutte le stanze libere quando in realtà dal 10 al 12 sono tutte occupate...
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
di seguito vedi la query che ho utilizzato e le immagini del risultato,
la 1a query estrae solo le camere occupate, la 2a estrae le camere libere
nel periodo da te indicato, sembra funzionare ....
ciao
Marino
Codice:
declare @idhotel  as int;
declare @room     as int;
declare @date_in  as datetime;
declare @date_out as datetime;

set @idhotel  = 1;
set @date_in  = '2014/10/08';
set @date_out = '2014/10/15';


SELECT * 
FROM roomreservations
WHERE
(
( date_in >= @date_in AND date_in <= @date_out ) 
OR
( date_out >= @date_in AND date_out <= @date_out ) 
)

SELECT * from rooms 
WHERE NOT EXISTS
(
SELECT room 
FROM roomreservations
WHERE
(
( date_in >= @date_in AND date_in <= @date_out ) 
OR
( date_out >= @date_in AND date_out <= @date_out ) 
)
AND room=rooms.room
)
1.PNG2.PNG
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
c'è un unico caso che non viene controllato e che non dovrebbe essere permesso,
il caso è dato dalle date di ingresso e uscita uguali, se vuoi controllare anche questa situazione puoi modificare così,
Codice:
SELECT * from rooms 
WHERE NOT EXISTS
(
SELECT room 
FROM roomreservations
WHERE
(
( date_in >= @date_in AND date_in <= @date_out ) 
OR
( date_out >= @date_in AND date_out <= @date_out ) 
OR
( @date_in >= date_in AND @date_in <= date_out ) 
)
AND room=rooms.room
)
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
nello zip allegato con i diversi screenshots, trovi il risultato di 10 casi, ho fatto scorrere le date di ingresso-uscita
ed in ciascuno screen,
nel primo blocco trovi le date di ingresso e di uscita usate per il test,
nel secondo blocco trovi le camere prenotate
nel terzo blocco trovi le camere libere
la query usata è l'ultima che ho postato
a me sembra che il risultato sia ok, fai sapere, ciao
Marino
Vedi l'allegato HotelReservationTests.zip
 
Ultima modifica:

lorenzo84

Utente Attivo
22 Lug 2012
236
0
16
Domani mattina ci riprovo... ma come ti ho scritto funziona perfettamente ma nel caso avessi
tutte le stanze occupate dal 10/10/2014 al 12/10/2014 e volessi prenotare dal 08/10/2014 al 15/10/2014 lui mi da tutte le stanze libere quando in realtà dal 10 al 12 sono tutte occupate... e non capisco perchè...
 

lorenzo84

Utente Attivo
22 Lug 2012
236
0
16
Buongiorno!!! Adesso funziona perfettamente tranne che se provo a prenota in concomitanza di un checkout... Cioè se ho una camera occupata dal 13 al 14/10/2014 e volessi prenotare una camera dal 14 al 15/10/2014 mi restituisce solo le camere completamente libere lasciando fuori quella con il checkout quando in realtà sarebbe libera. Mentre la stessa cosa sul checkin funziona bene...
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
ho tolto due "=", ho ricontrollato i 10 esempi e mi sembra funzionare bene
prova ... ciao
Marino
Codice:
SELECT * from rooms 
WHERE NOT EXISTS
(
SELECT room 
FROM roomreservations
WHERE
(
( date_in >= @date_in AND date_in <= @date_out ) 
OR
( date_out > @date_in AND date_out <= @date_out ) 
OR
( @date_in >= date_in AND @date_in < date_out ) 
)
AND room=rooms.room
)
scusa se non ho cambiato i nomi
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
mi ha lasciato un dubbio la tua affermazione, che la data di ingresso funzionava,
da cui ho ritoccato solo l'uscita
ma ho fatto l'esempio con excel che allego come pdf,
se concordi che si lascia la camera al mattino e la si occupa il pomeriggio,
quindi l'esempio rispetta le tue aspettative, ebbene la query e quella sotto indicata
non viene contemplato il caso di ingresso/uscita nello stesso giorno
ciao
Marino

Codice:
SELECT * from stanze 
WHERE NOT EXISTS
(
SELECT distinct stanzaID 
FROM prenotazioni
WHERE
(
( datain >= @datain AND datain < @dataout ) 
OR
( dataout > @datain AND dataout <= @dataout ) 
)
AND stanzaID=stanze.stanzaID
)
Vedi l'allegato DispoCamere.pdf
 

lorenzo84

Utente Attivo
22 Lug 2012
236
0
16
Ciao!!! Grazie mille per le risposte.
Adesso sembra funzionare tutto bene... Ecco la query definitiva:

PHP:
SELECT * from stanze 
WHERE NOT EXISTS
(
SELECT stanza_id
FROM prenotazioni
WHERE
(
( datain >= $datain AND datain < $dataout ) 
OR
( dataout > $datain AND dataout <= $dataout ) 

)
AND stanza_id=stanze.id_stanza
)
 

deejayp

Nuovo Utente
28 Gen 2019
1
0
1
scusate ragazzi,
sto realizzando un semplice pms e sto cercando di trovare la query corretta per l'inserimento di una prenotazione, controllando che la camera selezionata non sia ancora prenotata in un determinato periodo.

La soluzione che avete indicato indica le camere disponibili in un periodo prefissato.

Ma ho notato che se segnala questa opzione:

Prenotazione A:
Arrivo 30/01/2019
Partenza 02/02/2019

se provo ad inserire una prenotazione inserendo questa data:
Arrivo: 31/01/2019
Partenza: 01/02/2019

Mi da la camera libera, non leggendo la Prenotazione A con le date indicate precedentemente.

A voi non risulta?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
non so dirti esattamente in quanto non ho più seguito il problema, se noti l'ultima risposta risale al'ottobre 2014.
quindi non so se anno risolto.
comunque il ragionamento da fare (scrivo in pseudo codice)
ipotizziamo che la camerea sia occupata (o prenotata ) dal $DA al $DB
ti arriva una richiesta dal $d_in al $d_out
Codice:
//la camere è occupata da $DA a $DB
//arriva richiesta prenotazione
//da $d_in a $d_out
//prima verifica
if($d_in > $d_out){
    //evidente che questa verifica è essenziale
    //ERRORE -> ESCI   
}else{
    //verifichi la data di uscita richiest
    if($d_out < $DA){
        //puoi prenotare
        //la richiesta è tutta antecedente all'occupazione
    }else{
        if($d_in > $DB){
            //puoi prenotare
            //la richiesta è tutta successiva all'occupazione
        }else{
            //NON PUOI PRENOTARE, cambia camera
            //euna delle due date richieste interseca l'occupazione
        }   
    }     
}
una cosa a cui devi stare molto attento a quando si usano le date soprattutto per le verifiche a come le date sono formattate
esempio
01-12-2019 può risulare minore di 15-10-2018
a mio parere il metodo migliore è uasare il formato AAAA-mm-gg per i calcoli e poi visualizzaro correttamente in italiano
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
per verificare la disponibilità in un periodo
inserisci nella clausola where il codice,
Codice:
…..
AND NOT (@data_partenza < pr_arrivo OR pr_partenza < @data_arrivo)
dove le date con la chiocciola sono le data da verificare
le date "pr_...." sono le date già prenotate presenti nel db

le date devono essere nel formato "YYYY-mm-dd"

la clausola ti restituisce le camere prenotate
se non é sufficiente fatti vivo

( ps, merito di @Oldfan )
 
Ultima modifica: