Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    Query per assegnazione camere albergo

    Ciao ragazzi,
    mi date un consiglio?

    Dovrei realizzare una query che mi permetta di selezionare le camere libere di un albergo.

    Ho realizzato la seguente:

    SELECT *
    FROM camere
    WHERE id NOT IN (
    SELECT id_camera_assegnata
    FROM
    prenotazioni
    WHERE (
    ('2011-10-30' > data_arrivo AND '2011-10-30' < data_partenza) OR
    ('2011-11-01' > data_arrivo AND '2011-10-01' < data_partenza)
    ) AND id_tipo_camera='1' AND flag_conclusa='Y'
    )
    AND id_tipo_camera='1'

    Ma non sembra funzionare correttamente. Mi date una mano?

    Ciao!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    777
    potresti spiegaare come è composta la tabella a cui fai riferimento

  3. #3
    Ecco:

    CREATE TABLE `camere` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `descrizione` VARCHAR(50) NOT NULL,
    `id_tipo_camera` INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`)
    )

    CREATE TABLE `prenotazioni` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `data_arrivo` DATE NULL DEFAULT NULL,
    `data_partenza` DATE NULL DEFAULT NULL,
    `id_tipo_camera` INT(11) NULL DEFAULT NULL,
    `totale_iva_esclusa` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT '0.00',
    `totale` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT '0.00',
    `totale_iva` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT '0.00',
    `saldato` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT '0.00',
    `id_tipo_pagamento` INT(10) UNSIGNED NULL DEFAULT NULL,
    `ora_arrivo` VARCHAR(10) NULL DEFAULT NULL,
    `note` VARCHAR(500) NULL DEFAULT NULL,
    `id_camera_assegnata` INT(10) NULL DEFAULT NULL,
    `id_soggetto` INT(11) NULL DEFAULT NULL,
    `id_numero_ospiti` INT(10) NOT NULL,
    `flag_conclusa` VARCHAR(1) NOT NULL DEFAULT 'N',
    `timestamp` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `id_sessione` VARCHAR(25) NULL DEFAULT NULL,
    `id_trattamento` INT(10) UNSIGNED NOT NULL,
    `id_stato_prenotazione` INT(10) NOT NULL DEFAULT '1',
    `totale_camera` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
    `totale_iva_esclusa_camera` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
    `totale_iva_camera` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
    `totale_servizi_extra` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
    `totale_iva_esclusa_servizi_extra` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
    `totale_iva_servizi_extra` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
    `eseguito_check_out` VARCHAR(1) NOT NULL DEFAULT 'N',
    `data_check_out` DATETIME NULL DEFAULT NULL,
    `residuo_pagare` DECIMAL(10,2) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_prenotazioni_soggetti` (`id_soggetto`),
    INDEX `FK_prenotazioni_tipi_camere` (`id_tipo_camera`),
    CONSTRAINT `FK_prenotazioni_soggetti` FOREIGN KEY (`id_soggetto`) REFERENCES `soggetti` (`id`),
    CONSTRAINT `FK_prenotazioni_tipi_camere` FOREIGN KEY (`id_tipo_camera`) REFERENCES `tipi_camere` (`id`)
    )

    CREATE TABLE `tipi_camere` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `descrizione` VARCHAR(50) NOT NULL,
    `totale_iva_esclusa_default` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT '0.00',
    `totale_iva_default` DECIMAL(10,2) UNSIGNED NULL DEFAULT '0.00',
    `totale_default` DECIMAL(10,2) UNSIGNED NULL DEFAULT '0.00',
    `numero_massimo_ospiti` INT(10) UNSIGNED NOT NULL,
    `id_codice_iva` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
    )

    Per il periodo di riferimento in pratica bisogna verificare se esiste un tipo di camera determinato libero.

  4. #4
    La butto lì, prova:


    codice:
    SELECT *
    FROM camere
    WHERE id NOT IN (
    SELECT id_camera_assegnata
    FROM
    prenotazioni
    WHERE (
    (('2011-10-30' > data_arrivo AND '2011-10-30' < data_partenza) OR
    ('2011-11-01' > data_arrivo AND '2011-10-01' < data_partenza))
    ) AND id_tipo_camera='1' AND flag_conclusa='Y'
    )
    AND id_tipo_camera='1'
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    No, non va.

    Es:

    Prenotazione a db:

    Data arrivo: 2011-10-29
    Data Partenza: 2011-10-30
    Camera: 101

    La query da occupata la camera ma c'è da considerare che il 30 è libera poichè il cliente la lascia di mattina.

  6. #6
    Ciao,
    prima di tutto io eviterei di fare un NOT IN... non è affatto performante e quindi quando non è necessario (come mi pare in questo caso) meglio lasciarlo perdere

    Allora,
    tu hai due date
    arrivo :2011-10-30
    partenza 2011-11-05

    vuoi vedere quali camere libere ci sono per la tipologia 1
    quindi in prenotazioni deve cercare le camere che:
    - hanno data di arrivo e data di partenza vuota (non sono state prenotata)
    oppure
    - hanno la data di partenza <= 2011-10-30 (prenotate ma partono prima dell'arrivo <= così prendi anche il giorno della partenza la mattina)
    oppure
    -hanno la data di arrivo >2011-11-05 (è prenotate ma dopo la partenza)
    Infine devono avere tipologia 1

    quindi:
    ----------------
    SELECT cam.*
    FROM camere cam, prenotazioni pre
    WHERE
    (
    (pre.data_arrivo IS NULL AND pre.data_partenza IS NULL)
    OR pre.data_partenza <= '2011-10-30'
    OR pre.data_arrivo >'2011-11-05'
    )
    AND cam.id=pre.id_camera_assegnata
    AND pre.id_tipo_camera=cam.id
    AND cam.id=1
    ---------------------


    L'ho fatta a memoria senza provarla, magari c'è qualche errore di sintassi
    ma il concetto dovrebbe essere proprio questo...

  7. #7
    Non mi trovo. Perchè fai una join con le prenotazioni? Se la camera non è stata mai prenotata non funzionerebbe.

  8. #8
    Da quello che mi dici capisco ora che tu dentro 'prenotazioni' hai solo le camere prenotate, io ho pensato che le avessi tutte....

    allora ok devi fare la not in (quasi) per forza....

    Allora,
    tu hai due date
    arrivo :2011-10-30
    partenza 2011-11-05

    vuoi vedere quali camere libere ci sono per la tipologia 1
    quindi in prenotazioni deve escludere le camere che:
    - sono occupate da prima a dopo il periodo: (data di arrivo < 2011-10-30 AND data di partenza >2011-11-05)
    oppure
    - iniziano o finiscono l'occupazione proprio nel periodo: ((data_di_arrivo between 2011-10-30 AND 2011-11-04 -possono iniziare il 05 -) OR (data_di_partenza between 2011-10-30 AND 2011-11-05))

    SELECT *
    FROM camere
    WHERE id NOT IN (
    SELECT id_camera_assegnata
    FROM
    prenotazioni
    WHERE (
    (data_di_arrivo < 2011-10-30 AND data_di_partenza >2011-11-05)
    OR ((data_di_arrivo BETWEEN 2011-10-30 AND 2011-11-04)
    OR (data_di_partenza BETWEEN 2011-10-30 AND 2011-11-05)
    )
    AND id_tipo_camera='1' AND flag_conclusa='Y')
    AND id_tipo_camera='1'


    vedi un po' se ti torna...

  9. #9
    Funziona quasi.
    Ma devi considerare che il giorno di partenza del cliente precedente è un giorno libero.

    Es:

    Prenotazione già eseguita:
    arrivo :2011-10-30
    partenza 2011-11-05

    Tentata prenotazione:
    arrivo :2011-11-05
    partenza 2011-11-06

    Con la query:

    SELECT * FROM camere WHERE id NOT IN ( SELECT id_camera_assegnata
    FROM prenotazioni WHERE ( (data_arrivo < '2011-11-05' AND
    data_partenza >'2011-11-06')OR (data_arrivo BETWEEN '2011-11-05'
    AND '2011-11-05') OR (data_partenza BETWEEN '2011-11-05' AND
    '2011-11-06') )AND
    id_tipo_camera='1' AND flag_conclusa='Y') AND id_tipo_camera='1'

    la camera che si libera il 05/11 risulterebbe occupata mentre invece dal 05/11 è già libera ( poichè il checkin si fa alle 10 di mattina )

  10. #10
    ok è vero,
    ma quel è il problema?, significa solo che anche il controllo sulla data di partenza va spostato di un giorno indietro:


    Con la tua query:

    SELECT * FROM camere WHERE id NOT IN ( SELECT id_camera_assegnata
    FROM prenotazioni WHERE ( (data_arrivo < '2011-11-05' AND
    data_partenza >'2011-11-06')OR (data_arrivo BETWEEN '2011-11-05'
    AND '2011-11-05') OR (data_partenza BETWEEN '2011-11-05' AND
    '2011-11-05))AND
    id_tipo_camera='1' AND flag_conclusa='Y') AND id_tipo_camera='1'

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.