Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505

    Eventi di un dato giorno

    Ho una tabella contenente degli eventi.
    Questi eventi possono iniziare e finire all'interno dello stesso giorno o durare un qualsiasi periodo di tempo (3 giorni, 2 mesi e 5 giorni, 2 anni...).

    Per le date di inizio e fine ho nella tabella i campi "inizio" e "fine" in formato unix timestamp.

    Dato un giorno qualsiasi, ad esempio 7 - 12 - 2013 devo recuperare tutti gli eventi in corso questo giorno.

    Per la clausola where ho impostato le regole che seguono e sembrano funzionare, ma non sono certo di aver considerato tutti i casi possibili nel modo giusto e non so se magari ci fosse un sistema migliore per ottenere la stessa cosa.

    N.B: non posso trasformare la data dal formato gg-mm-aaaa in formato timestamp, altrimenti sarebbe stato facilissimo.
    codice:
    //inizio mese = 12 - anno = 2013
    //fine   mese = 12 - anno = 2013
    (DAY(FROM_UNIXTIME(inizio)) <= 7 AND MONTH(FROM_UNIXTIME(inizio)) = 12 AND YEAR(FROM_UNIXTIME(inizio)) = 2013 AND 
    DAY(FROM_UNIXTIME(fine)) >= 7 AND MONTH(FROM_UNIXTIME(fine)) = 12 AND YEAR(FROM_UNIXTIME(fine)) = 2013)
    
    //inizio mese = 12 - anno = 2013
    //fine   mese > 12 - anno = 2013
    OR (DAY(FROM_UNIXTIME(inizio)) <= 7 AND MONTH(FROM_UNIXTIME(inizio)) = 12 AND YEAR(FROM_UNIXTIME(inizio)) = 2013 AND 
    MONTH(FROM_UNIXTIME(fine)) > 12 AND YEAR(FROM_UNIXTIME(fine)) = 2013)
    
    //inizio mese = 12 - anno = 2013
    //fine   anno > 2013
    OR (DAY(FROM_UNIXTIME(inizio)) <= 7 AND MONTH(FROM_UNIXTIME(inizio)) = 12 AND YEAR(FROM_UNIXTIME(inizio)) = 2013 AND 
    YEAR(FROM_UNIXTIME(fine)) > 2013)
    
    //inizio mese < 12 - anno = 2013
    //fine   mese = 12 - anno = 2013
    OR (MONTH(FROM_UNIXTIME(inizio)) < 12 AND YEAR(FROM_UNIXTIME(inizio)) = 2013 AND 
    DAY(FROM_UNIXTIME(fine)) >= 7 AND MONTH(FROM_UNIXTIME(fine)) = 12 AND YEAR(FROM_UNIXTIME(fine)) = 2013)
    
    //inizio mese < 12 - anno = 2013
    //fine   mese > 12 - anno = 2013
    OR (MONTH(FROM_UNIXTIME(inizio)) < 12 AND YEAR(FROM_UNIXTIME(inizio)) = 2013 AND 
    MONTH(FROM_UNIXTIME(fine)) > 12 AND YEAR(FROM_UNIXTIME(fine)) = 2013)
    
    //inizio mese < 12 - anno = 2013
    //fine   anno > 2013
    OR (MONTH(FROM_UNIXTIME(inizio)) < 12 AND YEAR(FROM_UNIXTIME(inizio)) = 2013 AND 
    YEAR(FROM_UNIXTIME(fine)) > 2013)
    
    //inizio anno < 2013
    //fine   mese = 12 - anno = 2013
    OR (YEAR(FROM_UNIXTIME(inizio)) < 2013 AND 
    DAY(FROM_UNIXTIME(fine)) >= 7 AND MONTH(FROM_UNIXTIME(fine)) = 12 AND YEAR(FROM_UNIXTIME(fine)) = 2013)
    
    //inizio anno < 2013
    //fine   mese > 12 - anno = 2013
    OR (YEAR(FROM_UNIXTIME(inizio)) < 2013 AND 
    MONTH(FROM_UNIXTIME(fine)) > 12 AND YEAR(FROM_UNIXTIME(fine)) = 2013)
    
    //inizio anno < 2013
    //fine   anno > 2013
    OR (YEAR(FROM_UNIXTIME(inizio)) < 2013 AND 
    YEAR(FROM_UNIXTIME(fine)) > 2013)
    Vi pare corretto? Fareste diversamente?

  2. #2
    Proverei a semplificare il tutto:

    tu hai una data inizio evento ed una fine. Devi trovare se in una data definita l'evento era in corso/inizio/termine.
    La formuletta sarebbe semplice:

    where $tua_data between data_inizio and data_fine

    Ora bisognerebbe capire perche' non puoi trasformare una data gg-mm-yyyy in timestamp. Puoi farlo con il php oppure direttamente con sql.

    es: data trasformata in timestamp con php

    $tua_data = mktime(00, 00, 00, 12, 7, 2013);

    con sql (di mysql)

    $data = '7-12-2013';

    where unix_timestamp(str_to_date($data, '%d-%m-%Y')) between data_inizio and data_fine

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Il mio problema con l'orario è questo: un evento ha anche un ora di inizio e fine (sempre compreso nel timestamp), non solo il giorno.

    Gli eventi per il giorno vengono calcolati andando su una pagina web, qui viene recuperata data ed ora corrente che vengono usate dallo script che interroga il db alla ricerca degli eventi del giorno.

    Facciamola semplice e riferiamoci ad adesso 8/12/2013 13:50
    Per creare il timestamp devo per forza indicare un orario ed userei quello attuale, ma se ci fose un evento che inizia oggi alle 18:00 risulterebbe fuori dai criteri di ricerca e non verrebbe mostrato tra gli eventi di oggi... o mi sto impicciando tra le conversioni?

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    post doppio.

  5. #5
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Il mio problema con l'orario è questo: un evento ha anche un ora di inizio e fine (sempre compreso nel timestamp), non solo il giorno.

    Gli eventi per il giorno vengono calcolati andando su una pagina web, qui viene recuperata data ed ora corrente che vengono usate dallo script che interroga il db alla ricerca degli eventi del giorno.

    Facciamola semplice e riferiamoci ad adesso 8/12/2013 13:50
    Per creare il timestamp devo per forza indicare un orario ed userei quello attuale, ma se ci fose un evento che inizia oggi alle 18:00 risulterebbe fuori dai criteri di ricerca e non verrebbe mostrato tra gli eventi di oggi... o mi sto impicciando tra le conversioni?
    senza un orario viene considerato come 00:00:00 e quindi nel tuo caso citato adesso 8/12/2013 00:00:00

    effettivamente in caso di comparazione gli eventi di quel giorno sarebbero minori di 8/12/2013 13:50:00 e verrebbero esclusi

    Metti nella data anche ora:min:sec dell'ultimo secondo del giorno e tutto torna, e trascura ora:sec del web.

    $tua_data = mktime(23, 59, 59, 12, 8, 2013);

    con sql (di mysql)

    $data = '8/12/2013 23:59:59';

    where unix_timestamp(str_to_date($data, '%d/%m/%Y %h:%i:%s')) between data_inizio and data_fine

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Piu o meno viene cosi: ( che non è sostanzialmente diverso da quello che dice piero )
    codice:
    WHERE 
    (
    DataOraConsiderata > Day(DataOraInizio) 
    AND  
    DataOraConsiderata < (Day(DataOraFine) + 1)
    )
    dove in funzione del tuo DB
    Day(DataOraInizio) deve restituire il giorno di inizio alle ore 00:00:00
    (Day(DataOraFine) + 1) deve restituire il giorno successivo al giorno di Fine alle ore 00:00:00

    .
    Ultima modifica di nman; 08-12-2013 a 18:28

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Quote Originariamente inviata da piero.mac Visualizza il messaggio
    ...
    Metti nella data anche ora:min:sec dell'ultimo secondo del giorno e tutto torna, e trascura ora:sec del web.
    ...
    No, perché se l'evento del 8/12/2013 inizia alle 18:00 e finisce lo stesso giorno alle 22:00 (per dire), anche in quel caso lì risulta fuori se considero 8/12/2013 23:59:59 come data da confrontare.

  8. #8
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    No, perché se l'evento del 8/12/2013 inizia alle 18:00 e finisce lo stesso giorno alle 22:00 (per dire), anche in quel caso lì risulta fuori se considero 8/12/2013 23:59:59 come data da confrontare.
    E allora confronta solo il giorno.

    Se quello che conta e' che l'evento si sia svolto del tutto/iniziato/finito in quel dato giorno non ha senso confrontare le ore.

    where str_to_date('8/12/2013', '%d/%m/%Y') between FROM_UNIXTIME(data_inizio, '%Y-%m-%d') and FROM_UNIXTIME(data_fine, '%Y-%m-%d')

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Ecco, lo sapevo io che c'era un modo più facile di quello che stavo usando!

    Funziona, grazie

  10. #10
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Ecco, lo sapevo io che c'era un modo più facile di quello che stavo usando!

    Funziona, grazie
    contento pure io.
    Bisogna avere l'animo semplice quando si programma. Quello che non c'e' di sicuro non si guasta.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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