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

    Problema con range di date

    Ciao ragazzi,
    mi sono incagliato su un problema di per sè banale in quanto a logica ma che mi perplime sul lato pratico.
    Due tabelle si legano tramite un ID in relazione 1 => molti.
    Una singola entità della prima tabella può avere molte corrispondenze nella seconda tabella.

    Una riga della tabella2 per una singola entità di tabella1 non può avere una sovapposizione di date con un'altra riga della tabella2 relativa alla stessa entità, e questo non è un problema, ci pensa la logica Php.

    Le date da considerare sono 4, data_in_presunta, data_out_presunta e data_in_effettiva, data_out_effettiva.

    Il problema sorge quando devo trovare tutte le entità di tabella1 che sono "disponibili" dato un certo intervallo di date, che quindi devo confrontare sia con le date presunte che con quelle effettive.

    Le date sono memorizzate in UTS. Se servono altre info chiedete pure.

    Grazie a chiunque riesca a darmi una mano


  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Posta un dump di qualche riga e il risultato atteso.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    è un pochino "cervellotico"; da quanto posso intuire vuoi identificare il primo "bucket" libero?

    Se è così hai varie strategie più o meno "maialone".

    la prima è quella di estrarre le date già occupate, e cercare con un banale scan dall'inizio la prima che ha la data non consecutiva con la successiva

    16.03.2011
    17.03.2011
    19.03.2001

    Altra strategia è quella di tenere un "calendario" (una tabella con una riga per ogni giorno, o meglio un flag per ogni giorno), che "occupi" (poni a 1) quando è occupata.
    A quel punto ti basta una select sortata con where=1 e limit per prendere quella "minore" o "maggiore"

  4. #4
    Posto l'export mysql
    codice:
    --
    -- Struttura della tabella `Prenotazioni`
    --
    
    CREATE TABLE IF NOT EXISTS `Prenotazioni` (
      `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `ID_Cliente` int(10) unsigned NOT NULL,
      `ID_Camera` smallint(5) unsigned NOT NULL,
      `ID_Stato_Prenotazione` tinyint(3) unsigned NOT NULL,
      `Data_Prenotazione` int(10) unsigned NOT NULL,
      `Data_Check_In` int(10) unsigned NOT NULL,
      `Data_Check_Out` int(10) unsigned NOT NULL,
      `Data_Check_In_Prevista` int(11) unsigned NOT NULL DEFAULT '0',
      `Data_Check_Out_Prevista` int(11) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`ID`),
      UNIQUE KEY `ID_Cliente` (`ID_Cliente`,`ID_Camera`,`Data_Check_In`),
      KEY `Data_Check_In` (`Data_Check_In`,`Data_Check_Out`),
      KEY `ID_Stato_Prenotazione` (`ID_Stato_Prenotazione`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
    
    --
    -- Dump dei dati per la tabella `Prenotazioni`
    --
    
    INSERT INTO `Prenotazioni` (`ID`, `ID_Cliente`, `ID_Camera`, `ID_Stato_Prenotazione`, `Data_Prenotazione`, `Data_Check_In`, `Data_Check_Out`, `Data_Check_In_Prevista`, `Data_Check_Out_Prevista`) VALUES
    (1, 1, 2, 0, 1293836459, 1294149600, 1294480800, 0, 0),
    (2, 3, 1, 0, 1293836459, 1294219800, 1294583400, 0, 0),
    (3, 1, 3, 0, 1293836459, 1294497000, 1294651800, 0, 0),
    (4, 3, 4, 0, 1293836459, 1299798000, 1301007600, 0, 0),
    (6, 5, 5, 0, 0, 0, 0, 1299798000, 1301007600);
    Io vorrei trovare le camere (gli id bastano e avanzano) che sono libere nel periodo 12 marzo - 18 marzo (quindi stante la tabella tutte tranne la numero 4 e la numero 5)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    sono di fretta, sto evolvendo il mio gestionale.

    fermo che prima o poi ti servirà un vero e proprio calendario (per il tableau), se non ho capito malissimo vuoi le righe che hanno una data che NON è compresa tra data_check_in_prevista e data_check_out_prevista?

    Quale sarebbe la difficoltà? qualcosa mi sfugge

    PS consiglio da amicone, fanculizza i timestamp UNIX, diventerai rapidamente idrofobo in fase di debug

  6. #6
    Originariamente inviato da franzauker
    sono di fretta, sto evolvendo il mio gestionale.

    fermo che prima o poi ti servirà un vero e proprio calendario (per il tableau), se non ho capito malissimo vuoi le righe che hanno una data che NON è compresa tra data_check_in_prevista e data_check_out_prevista?

    Quale sarebbe la difficoltà? qualcosa mi sfugge

    PS consiglio da amicone, fanculizza i timestamp UNIX, diventerai rapidamente idrofobo in fase di debug
    No, mi serve trovare le righe che ove le date di check_in (effettiva o presunta) non siano nell'intervallo che specifico io (come deto nell'esempio tra il 12 Marzo e il 18 Marzo).
    Riguardo il timestamp mi trovo più comodo con gli interi e comunque ho delle funzioni che mi convertono in una data subito dopo aver estratto le righe (ed "automaticamente", quindi sempre, non corro il rischio di dimenticarmi di fare la conversione)
    Riguardo il calendario...tutto sommato mi troverei con dei dati ridondanti (ho messo solo la tabella prenotazioni ma ce ne sono altre ovviamente). Grazie comuque del consiglio, valuterò in seguito se serve.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Dascos
    No, mi serve trovare le righe che ove le date di check_in (effettiva o presunta) non siano nell'intervallo che specifico io (come deto nell'esempio tra il 12 Marzo e il 18 Marzo).
    continuo a non capire esattamente qual'è il dubbio

    Se ti "incasini" con gli intervalli... negali.
    Verifica se l'intervallo ricade (>= e <= limiti AND >=, <=) e mettici un bel NOT davanti.

    Il problema è che puoi avere DUE intervalli? o Che questi possono essere overlapped?

    Riguardo il timestamp ...
    sei coraggioso... io se non posso vedere esattamente le query che "passano" e i relativi risultati non dormo tranquillo

    Riguardo il calendario...tutto sommato mi troverei con dei dati ridondanti...
    E' chiaramente ridondante, ma semplifica di 10.000 volte il tableau, il disegnare le form e pure i report

  8. #8
    una domanda filosofica: a cosa ti serve testare le date effettive? quelle le saprai "dopo", quindi non andrebbero coinvolte nella ricerca delle disponibilità future...

  9. #9
    Allora, cerco di andare con ordine.
    Testare le date effettive mi serve perchè una prenotazione può essere in 3 stati: prenotata, riservata e "occupata".
    In prenotata...beh...è solo prenotata e ho solo le date presunte. Riservata il cliente ha pagato una caparra ma comunque le date sono solo quelle previste. Occupata il cliente è nella camera e quindi ho tutte le date (al massimo non ho la data effettiva di checkout).
    Il problema, franzauker, è che queste date possono sovrapporsi tra loro (es: in prevista: 3 marzo, out prevista 21 marzo, in effettiva 2 marzo, out effettiva 20 marzo).
    Io devo poter recuperare le camere che tra il 12 marzo e il 18 marzo sono libere, quindi data la tabella di cui prima, devo trovre tutti gli ID della camere tranne il 4 e il 5 perchè le date ricadono nell'intervallo scelto

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    come avevo "intuito" ti turba il fatto di avere due intervalli.

    Ma perchè, a pensarci bene, questo rappresenta un problema?
    Fermo che, in questo caso, lavorerei lato-applicazione facendo proprio una apposita funzione, così come prima idea mi viene in mente (se proprio vuoi operare sul db) di fare una stored la quale

    1) innanzitutto verifica se i due intervalli sono sovrapposti
    (chiamiamoli inizio1,fine1, inizio2 e fine2, per poi avere l'intervallo unione, diciamo iniziounione, fineunione)

    Passi preliminari sono scambiare inizio1 e fine1 (se non sono ordinati), e inizio2 con fine2.

    Poi verifica quale dei due inizi (1 o 2) è maggiore, e nel caso scambi inizio1-fine1 con inizio2-fine2 li scambi, così li hai sempre ordinati i due intervalli (intervallo1 <=intervallo2)

    A questo punto se inizio2 < fine1 allora sono overlapped, e quindi
    iniziounione=inizio1, fineunione=fine2

    E il test del tuo "intervallino" lo fai lì dentro

    ---
    Nel caso in cui invece siano disgiunti il test del tuo "intervallino" (da verificare) lo fai dentro l'intervallo "giusto" (tra 1 e 2) partendo dall'estremo superiore.
    ---
    Poi mi vengono in mente strategia meno sceme, tipo prendere la lunghezza dell'intervallo da testare (cosa che puoi fare)... ma direi che te la puoi cavare facilmente.
    ---
    Alla fine il problema è che vuoi una "querona" invece di un programmello o di una storerina?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.