[MySQL] Verifica disponibilità camera

marino51

Utente Attivo
28 Feb 2013
3.204
207
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
239
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
3.204
207
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
3.204
207
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
3.204
207
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
239
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
239
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
3.204
207
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
3.204
207
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
239
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.046
150
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
3.204
207
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:
Discussioni simili
Autore Titolo Forum Risposte Data
dynamicdevotion Ciclo di verifica multipla su campo DB mysql PHP 4
K form Inserimento record mysql PHP 2
P Mysql lento a cancellare MySQL 1
P Codifica caratteri speciali mysql php PHP 0
N MAX() + ADD_DATE - per update su Mysql MySQL 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
W MySQL ciclo in SELECT MySQL 0
L Mysql gestionale multipiattaforma MySQL 0
W MySQL SELECT list dinamica MySQL 0
M utilizzo mysql in nodejs - crea createdAt e updateAt MySQL 1
T colonne di tabelle mysql ordinate MySQL 0
M Sintassi "personalizzata" per mysql workbench? MySQL 0
A Mysql MySQL 0
F Ricreare struttura php+mysql su Xampp Apache 0
M Array associativi php su 2 campi mysql PHP 10
Z Controllo giorni MYSQL PHP 0
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
L Mysql: Nascondere le pagine dopo una ricerca PHP 1
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
S problema con recupero dati tabella mysql PHP 2
E Progressbar estrazione dati da tabella mySQL Ajax 9
Z MySql injection PHP PHP 1
D controllare valore in tabella mysql PHP 0
A pulsante di update campo mysql con javascript Javascript 2
R Tutto su utf-8 ma ancora problemi con i caratteri speciali in mysql MySQL 1
T differenza fra mysql xampp e un mysql server Database 0
R Importazione csv su mysql tramite array PHP 2
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
D problema php mysql PHP 1
D problema php mysql PHP 1
N Server mysql non raggiungibile da connessione esterna MySQL 1
B Crea pdf da tabella mysql "ultima riga modificata" MySQL 4
D evitare di inserirre duplicati in mysql PHP 4
L salvare codice html in mysql PHP 3
L Google chart php mysql PHP 2
S Gestire scelta dropdown con dati da Mysql PHP 2
K cron job mysql PHP 3
elpirata Query per leggere dati da una tabella mysql e mostrarli a video in base a parametri passati tramite GET PHP 5
R Errore UPDATE tabella mysql PHP 1
R Caricamento immagine su cartella remota + mysql PHP 3
D Emoji in mysql Database 0
L Aiuto per programma web php/mySQL PHP 2
S Problema esportazione tabelle Mysql in Excel PHP 0
S Cancellare una riga MYSQL PHP 1
L Ricerca valore mysql e incremento PHP 73
G database mysql contengono informazioni ? MySQL 0

Discussioni simili