Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Help query su date stagione calcistica

    Ciao a tutti.
    Sto perdente un po troppo tempo con una query selettiva su alcuni campi data in formato TIMESTAMP.

    La tabella non è altro che il calendario di partite di campionato (ho presupposto come limite stagione da Luglio dell'anno precedente a Luglio dell'anno corrente).
    Siccome in tabella sono presenti anche partite di stagioni passate, vorrei che la query restituisse SOLO le partite della stagione corrente.

    Ho abbozzato qualcosa del genere:


    Codice PHP:
    //preparo la data
    $data date("d/m/Y");
    $data explode('/'$data);
    $day $data[0];
    $month $data[1];
    $year $data[2];

    //calcolo l'anno precedente e successivo
    $prev_year=$year-1;
    $next_year=$year+1;

    //presuppongo che Luglio (07) sia il limite di ricerca stagione 

    if ($month=="07") {
        
    $stagione="finita";
        
    //costruisco il TIMESTAMP (secondi a 0) dal 1 al 31 del mese
        
    $season_start=mktime(0,0,0,$month,1,$prev_year);
        
    $season_finish=mktime(0,0,0,$month,31,$year);
    }
    else {
        
    $stagione="in corso";
        
    //costruisco il TIMESTAMP (secondi a 0) dal 1 al 31 del mese
        
    $season_start=mktime(0,0,0,$month,1,$year);
        
    $season_finish=mktime(0,0,0,$month,31,$next_year);

    }

    //leggo il calendario in base alla query  
    $sql "SELECT * FROM calendario         
    WHERE matchdate>
    $season_start
    AND matchdate<
    $season_finish
    ORDER BY matchdate DESC"

    ma ovviamente se mi trovo ad esempio nella data "01-05-2009" l'if entra nella prima selezione e mi legge sono i record di Maggio.

    mi sto perdendo in un bicchier d'acqua..
    scusate il mio php forse un po lungo, non conosco ancora benissimo tutte le funzioni veloci.

    qualcuno ha idee?
    grazie

  2. #2
    ho risolto un po rozzamente impostando inizio e fine mese manualmente, così:

    Codice PHP:
    //siccome ad Agosto non ci sono partite (08) presuppongo che Luglio (07) il limite di ricerca stagione 
    if ($month=="07") {
        
    $stagione="finita";
        
    //costruisco il TIMESTAMP (secondi a 0)
        
    $season_start=mktime(0,0,0,"08","01",$prev_year);
        
    $season_finish=mktime(0,0,0,"07","31",$year);
    }
    else {
        
    $stagione="in corso";
        if (
    $month<"07") {
            
    //costruisco il TIMESTAMP (secondi a 0)
            
    $season_start=mktime(0,0,0,"08","01",$prev_year);
            
    $season_finish=mktime(0,0,0,"07","31",$year);
            }
        else 
    // >07 (se fosse uguale si sarebbe fermato prima
            
    {
            
    //costruisco il TIMESTAMP (secondi a 0)
            
    $season_start=mktime(0,0,0,"08","01",$year);
            
    $season_finish=mktime(0,0,0,"07","31",$next_year);
            }

    altri modi?
    ciao.

  3. #3
    mi perdo con i numeri e con le stringhe php .... colpa del caldo.

    suggerisco senza aver letto piu' di tanto:

    le date nel database (matchdate) dovrebbero essere nel formato ansi yyyy-mm-dd

    quando imposti il range di validita' della query di ricerca metterai le date di inizio-fine campionato.

    es: where matchdate beetwen '2008-08-01' and '2009-07-31'

    serve null'altro.

    attenzione che per il php i numeri che iniziano con 0 sono considerati ottali. quindi 08 nel mktime e' un errore.

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

  4. #4
    ho già semplificato un po la query di ieri, il caldo aveva cotto anche me!
    ecco comunque il between non lo conoscevo, è un ottima soluzione (tra l'altro posso anche tenerli in timestamp, non cambia molto).
    mi sono accorto anche del 08, passo tutto con gli apostrofi per sicurezza (funziona).
    grazie

  5. #5
    Originariamente inviato da davidino80
    ho già semplificato un po la query di ieri, il caldo aveva cotto anche me!
    ecco comunque il between non lo conoscevo, è un ottima soluzione (tra l'altro posso anche tenerli in timestamp, non cambia molto).
    mi sono accorto anche del 08, passo tutto con gli apostrofi per sicurezza (funziona).
    grazie
    per una ricerca basata sulle date (anno-mese-giorno) il timestamp ha la palla al piede dell'orario per cui a parita' di data potrebbe essere o non essere visibile qualche risultato.

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

  6. #6
    offline tutto apposto, online no!
    non capisco perchè su Aruba (php e mysql 5) mi dia un'errore mysql sulla funzione FROM_UNIXTIME (che ho usato per un controllo al posto del between).

    codice:
    FUNCTION miosql.FROM_UNIXTIME does not exist
    cerco un po su internet..

  7. #7
    questa è bella, funziona dappertutto a parte che su Aruba: FROM_UNIXTIME non è riconosciuto come funzione da mysql 5.0.68.. com'è possibile?

    ecco la query incriminata (premetto che selldate e buydate sono in formato timestamp):
    codice:
    SELECT * FROM players 
    WHERE FROM_UNIXTIME (selldate,'%Y')>2008
    AND buydate<UNIX_TIMESTAMP("2009-07-31")
    come posso altrimenti estrapolare l'anno da un UNIX_TIMESTAMP senza bisogno di farlo via php con una lettura precedente???

  8. #8
    se hai lasciato uno spazio tra la funzione e la parentesi come riporti potrebbe non funzionare in SQL

    FROM_UNIXTIME (selldate,'%Y')>2008

    FROM_UNIXTIME(selldate,'%Y') > 2008

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

  9. #9
    Originariamente inviato da piero.mac
    se hai lasciato uno spazio tra la funzione e la parentesi come riporti potrebbe non funzionare in SQL

    FROM_UNIXTIME (selldate,'%Y')>2008

    FROM_UNIXTIME(selldate,'%Y') > 2008
    :quote: non ci credo!! hai ragione!
    offline però funziona lo stesso.. bah mistero! grazie mille Piero alla prossima.

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.