• User Newbie

    Un consiglio per una query

    Ciao a tutti!
    Ho bisogno di un consiglio per quanto riguarda una query, non sto proprio riuscendo a venirne a capo...

    Ho una tabella eventi contenente vari campi, tra cui data_inizio e data_fine, di tipo DATETIME, contenenti data e ora di inizio e data e ora di fine di un determinato evento.

    Attualmente, per selezionare gli eventi in base a una particolare data, utilizzo questa query:

    SELECT * FROM eventi WHERE DATE_FORMAT(<data_corrente>,'%Y-%m-%d') = DATE_FORMAT(data_inizio,'%Y-%m-%d');
    

    In questo modo riesco a raccogliere tutti gli eventi che iniziano tra la mezzanotte della data immessa e fino alle 23:59 della stessa.
    Tutto questo sarebbe perfetto se tutti gli eventi terminassero in giornata o nelle prime ore del giorno dopo (es, se terminano alle 2:00, appartengono comunque al giorno precedente, quindi il problema non si pone): purtroppo ci sono alcuni eventi periodici (es fiere, settimane speciali, ecc...) in cui l'evento dovrebbe comparire per ogni giorno che compone.

    Ho provato con una variante,

    SELECT * FROM eventi WHERE DATE_FORMAT('<data_corrente>','%Y-%m-%d') BETWEEN data_inizio AND data_fine;
    

    che non va bene, perché mi restituisce anche gli eventi del giorno precedente che terminano dopo la mezzanotte.

    Sapete consigliarmi qualche impostazione alternativa per la query? Ora come ora sono a corto di ispirazione :dull:

    Grazie!


  • User Attivo

    Un idea potrebbe essere quella di trasformare la data DATETIME in TIMESTAMP.
    Così facendo tutti gli eventi si visualizzeranno fino all'ora del giorno stabilito confrontando il TIMESTAMP del database col TIMESTAMP della data attuale del server.
    Spero sia stato chiaro altrimenti fatti risentire.


  • User Newbie

    Grazie per il consiglio, al momento ho risolto in un modo differente,
    creando due view, eventi_periodici ed eventi_singoli: la prima raccoglie tutti gli eventi che durano più di 24 ore, la seconda invece raccoglie gli eventi aventi durata inferiore alle 24 ore.
    In questo modo, per ogni giorno, effettuo una UNION tra due interrogazioni: la prima sulla vista eventi_periodici

    SELECT * FROM eventi_periodici WHERE DATE_FORMAT('<data_corrente>','%Y-%m-%d') BETWEEN data_inizio AND data_fine;
    

    e la seconda sulla vista eventi_singoli

    SELECT * FROM eventi_singoli WHERE DATE_FORMAT(<data_corrente>,'%Y-%m-%d') = DATE_FORMAT(data_inizio,'%Y-%m-%d');
    

    Più avanti ho apportato un'ulteriore miglioria: ho aggiunto un campo booleano periodico alla tabella eventi, così da ridurre la mole di calcoli da fare, riga per riga per calcolare la differenza tra data_fine e data_inizio. Ora mi va più che bene!


  • User Attivo

    Ciao,

    SELECT * FROM eventi WHERE DATE_FORMAT('<data_corrente>','%Y-%m-%d') BETWEEN data_inizio AND data_fine;
    dovendo "filtrare" anche in funzione della'ora, perchè la "data_corrente" è formattata solo con anno,mese e giorno?

    SELECT * FROM eventi WHERE DATE_FORMAT('<data_corrente>','%Y-%m-%d %h:%i:%s') BETWEEN data_inizio AND data_fine;
    

    Poi... se la query deve essere eseguita per selezionare in funzione non di una data specifica, ma della data corrente, puoi utilizzare la funzione NOW() che è molto più comoda:

    SELECT * FROM eventi WHERE NOW() BETWEEN data_inizio AND data_fine;
    

  • User Newbie

    @Magicale said:

    Ciao,
    dovendo "filtrare" anche in funzione della'ora, perchè la "data_corrente" è formattata solo con anno,mese e giorno?
    In realtà, nel caso che sto adottando nel caso di eventi singoli, non è più rilevante l'ora, in quanto utilizzo come riferimento la sola data d'inizio (ad essere interrogata è ora la vista eventi_singoli, i cui eventi so per certo avere una durata inferiore alle 24 ore).

    Poi... se la query deve essere eseguita per selezionare in funzione non di una data specifica, ma della data corrente, puoi utilizzare la funzione NOW() che è molto più comoda:
    Concordo, ma non è applicabile al mio caso, perchè la data nella query può cambiare in continuazione: a livello di interfaccia ho un calendario; al caricamento della pagina viene eseguita la query fornendo la data corrente, mentre nel caso in cui venga selezionato un giorno diverso del calendario, la data fornita sarà quella del giorno selezionato.

    In realtà la "data_corrente" specificata nella query, è la data in base alla quale bisogna fare la ricerca, quindi non necessariamente la data corrente.