[MySQL] Verifica disponibilità camera

Discussione in 'MySQL' iniziata da lorenzo84, 5 Ottobre 2014.

  1. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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
    )
    
     
  2. lorenzo84

    lorenzo84 Utente Attivo

    Registrato:
    22 Luglio 2012
    Messaggi:
    236
    Mi Piace Ricevuti:
    0
    Punteggio:
    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...
     
  3. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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.PNG 2.PNG
     
  4. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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
    )
    
     
  5. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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: 9 Ottobre 2014
  6. lorenzo84

    lorenzo84 Utente Attivo

    Registrato:
    22 Luglio 2012
    Messaggi:
    236
    Mi Piace Ricevuti:
    0
    Punteggio:
    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è...
     
  7. lorenzo84

    lorenzo84 Utente Attivo

    Registrato:
    22 Luglio 2012
    Messaggi:
    236
    Mi Piace Ricevuti:
    0
    Punteggio:
    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...
     
  8. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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
     
  9. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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
     
  10. lorenzo84

    lorenzo84 Utente Attivo

    Registrato:
    22 Luglio 2012
    Messaggi:
    236
    Mi Piace Ricevuti:
    0
    Punteggio:
    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
    )
     
  11. deejayp

    deejayp Nuovo Utente

    Registrato:
    28 Gennaio 2019
    Messaggi:
    1
    Mi Piace Ricevuti:
    0
    Punteggio:
    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?
     
  12. borgo italia

    borgo italia Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    4 Febbraio 2008
    Messaggi:
    16.025
    Mi Piace Ricevuti:
    146
    Punteggio:
    63
    Sesso:
    Maschio
    Località:
    PR
    Home Page:
    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
     
  13. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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: 29 Gennaio 2019
Sto caricando...

Condividi questa Pagina