• User

    Estrarre un dato del giorno precedente

    Ciao,

    grazie al vs. aiuto ho sviluppato una query di questo tipo che funziona perfettamente per calcolare la differenza percentuale:

    $oggi = "SELECT ticker, timeStamps, closeData FROM miatabella WHERE ticker = 'ABC' ORDER BY timeStamps DESC LIMIT 1";
    $d_oggi = $db->sql_query($oggi);
    while ($row = $db->sql_fetchrow($d_oggi)) {
    $dato_oggi = $row['closeData'];
    }
    $ieri = "SELECT ticker, timeStamps, closeData FROM miatabella WHERE ticker = 'ABC' ORDER BY timeStamps ASC LIMIT 1";
    $d_ieri = $db->sql_query($ieri);
    while ($row = $db->sql_fetchrow($d_ieri)) {
    $dato_ieri = $row['closeData'];
    }

    $percentuale = (($dato_oggi - $dato_ieri) * 100)/$dato_ieri;
    $percentuale = number_format($percentuale, 2, '.', '');

    In fase di test, per verificare che i calcoli sono giusti,ho comparato il primo e l'ultimo dato presenti nella tabella ma in realtà devo comparare l'ultimo dato inserito (in ordine temporale quindi quello di oggi) e quello immediatamente precedente (ieri).
    Sono imballato perchè non so come impostare la query ($ieri) per richiamare il dato precedente all'ultimo inserito.

    Grazie

    :xNik


  • User

    Ciao,
    se sei sicuro che hai un solo record per giorno puoi usare qualcosa come:

    [php]
    $oggieieri = "SELECT ticker, timeStamps, closeData FROM miatabella WHERE ticker = 'ABC' ORDER BY timeStamps DESC LIMIT 2";
    $d_oggieieri = $db->sql_query($oggieieri);
    $row = $db->sql_fetchrow($d_oggieieri);
    $dato_oggi = $row['closeData'];
    $row = $db->sql_fetchrow($d_oggieieri);
    $dato_ieri = $row['closeData'];
    [/php]Magari controlla che ci siano effettivamente due record risultanti, per evitare una divisione per zero nei calcoli successivi.

    Ciao
    Bruno


  • User

    Ciao,

    grazie mille, funziona!! Sì è un solo dato per giorno.

    Mi ero perso seguendo la strada della differenza tra date (SUB_DATE, interval 1 day, etc... )

    Se possibile, avrei un altro quesito:

    una volta ottenuta la percentuale:

    $percentuale = (($dato_oggi - $dato_ieri) * 100)/$dato_ieri;
    $percentuale = number_format($percentuale, 2, '.', '');

    dovrei associare il segno '+', una freccia verde con la punta verso
    l'alto ed il colore verde quando la differenza percentuale è positiva e una freccia rossa
    con la punta verso il basso quando la differenza percentuale genera un numero negativo (il segno'-' già lo dà, dovrei solo attribuire il colore rosso).

    Grazie

    :ciauz:Nik


  • User

    dovrei associare il segno '+', una freccia verde con la punta verso
    l'alto ed il colore verde quando la differenza percentuale è positiva e una freccia rossa
    con la punta verso il basso quando la differenza percentuale genera un numero negativo (il segno'-' già lo dà, dovrei solo attribuire il colore rosso).Mah, di primo acchito io farei qualcosa tipo (ma non e' detto sia la soluzione migliore):
    [php]if ($percentuale>0.0) {
    $out.='<span class="positive"><img src="frecciasu.gif"/>+' . $percentuale . '</span>';
    }
    else if ($percentuale<0.0) {
    $out.='<span class="negative"><img src="frecciagiu.gif"/>' . $percentuale . '</span>';
    }
    else {
    $out.='<span class="neutral"><img src="nofreccia.gif"/> 0.00</span>';
    }
    [/php]e poi giocherei col CSS per i font e colori.

    Ciao
    Bruno


  • User

    Grazie, provo.


  • User

    Ciao Bruno,

    la soluzione è buona, l'ho adattata e va bene.

    Adesso mi accingo a preparare una query per estrarre tutti i records inseriti ma solo dell'ultima data come questa:

    $result = $db->sql_query("SELECT aaa, DATE_FORMAT(timeStamps,'%d-%m-%Y') as date, bbb, ccc, ddd, From miatabella WHERE timeStamps = ???ORDER BY timeStamps (o altro) DESC");

    Non so come scrivere l'istruzione WHERE per estrarre solo gli ultimi records inseriti (sono più records per data)

    Grazie ancora

    Nikk


  • User

    Ciao,
    non e' che utilizzi spesso le date (preferisco i timestamp numerici per le date nella Unix-era) comunque puoi provare con:

    $Oggi=date('Y-m-d');
    $Domani=date('Y-m-d', time()+3600*24);
    $result = $db->sql_query("SELECT aaa, DATE_FORMAT(timeStamps,'%d-%m-%Y') as date, bbb, ccc, ddd, From miatabella WHERE timeStamps >= '$Oggi' AND timeStamps<'$Domani'
    ORDER BY timeStamps (o altro) DESC");

    Comunque c'e' una discussione in corso qui in cui probabilmente usciranno piu' dettagli.

    Ciao
    Bruno


  • User

    Ciao Bruno,

    ti spiego. Ho un applicativo che visualizza i dati azionari sotto forma di grafico. A monte ho creato nel db una tabella con un determinato numero di campi tra cui il timestamps che deve essere NULL di default. Ma se come tipo di campo scelgo timestamp non gli attribuisce il valore NULL. Così ho scelto datetime per avere NULL di default.

    Vuoi dire che con un timestamp numerico sarebbe più semplice? Il problema del valore NULL come lo risolvo?

    Ciò che sto cercando di fare è che sulla base dei records presenti nella tabella del db (records che vengono aggiornati ogni giorno dopo un det. orario) devo estrarre solo quelli inseriti per ultimo in base alla data. ( per esempio oggi pomeriggio caricherò i records di oggi con timestamps 18-07-2007 che verranno visualizzati in una pagina web fino a domani pomeriggio quano appunto farò il nuovo aggiornamento della tabella.

    Con la query sto cercando di generare quindi una lista di dati che il giorno dopo ad un det. orario si aggiornerà con i nuovi.


  • User

    Ciao,
    a dire il vero io uso campi di tipo INT per i timestamp, vuoi per abitudine, vuoi perche' non mi piace costruirmi le date come stringhe, vuoi perche' TIMESTAMP ha troppi automatismi come anche tu hai notato.
    Comunque credo che sia questione di gusto personale o particolari necessita'.
    Coi campi INT il NULL puo' essere valore di default, ma continua ad usare quello che hai gia' fatto visto che la tua scelta e' stata ponderata.

    Credo che la query vada bene cosi' per quello che devi fare.

    Ciao
    Bruno


  • User

    Ok, continuo a provare

    Ciao

    Nik


  • User

    Ciao Bruno,

    ho fatto una piccola modifica perchè gli ultimi records inseriti sono quelli di ieri che oggi alle ore tot verranno sostituiti con i nuovi che resteranno fino a domani e così via.

    query db:

    $Ieri = date('Y-m-d', time() - 86400);
    $Oggi=date('Y-m-d');
    $Domani=date('Y-m-d', time() + 86400);
    $result = $db->sql_query("SELECT aaa, DATE_FORMAT(timeStamps,'%d-%m-%Y') as date, bbb, ccc, ddd, eee, fff From miatabella WHERE timeStamps >= '$Ieri' AND timeStamps <'$Domani'
    ORDER BY timeStamps DESC");

    Spero vada bene, mi sorge un dubbio per quanto riguarda il lasso di tempo tra il venerdì e il lunedì successivo , ma forse sbaglio ...

    Nik


  • User

    Ciao,
    da quello che ho capito con questa tua ultima query rischi di inserire record duplicati se l'aggiornamento lo effettui giornalmente.

    A questo punto direi che bisogna vedere il sistema nel suo complesso. Da quel che ho capito tu hai una tabella che viene aggiornata giornalmente, diciamo, alle ore 18:00. Tu vuoi prendere ogni giorno da questa tabella i dati giornalieri ed inserirli in una seconda tabella.
    Ora, il modo di costruire la query dipende anche da come funziona il sistema. Per esempio, siamo sicuri che alle 18:00 la prima tabella e' aggiornata, sempre e comunque? Se si', allora puoi schedulare l'import ogni giorno, diciamo, alle 19:00 e quindi vale la query originaria (al sabato e domenica in cui non ci sono dati, la query non ritornera' alcun record).

    Nel caso l'orario non sia fisso o la durata dell'aggiornamento della prima tabella sia "ballerino" (cioe' puo' durare sia 5 minuti che qualche ora per una causa qualsiasi) la procedura di aggiornamento dovra' essere un po' piu' flessibile, ma magari non serve parlarne adesso perche' rientri nel caso sopra.

    Ciao
    Bruno


  • User

    Ciao Bruno,

    se la query al sabato e alla domenica non restituisce records, nella pagina web si visualizzano quelli del venerdì (vale a dire gli ultimi inseriti) ?

    Comunque si potrebbe impostare nel file .php un aggiornamento delle tabelle in automatico, naturalmente ad una determinata ora?

    Grazie!

    Nik


  • User

    @nik06 said:

    se la query al sabato e alla domenica non restituisce records, nella pagina web si visualizzano quelli del venerdì (vale a dire gli ultimi inseriti) ?

    Non saprei, dipende come imposti l'accesso al db nella pagina web, puoi scegliere quello che vuoi far vedere.

    @nik06 said:

    Comunque si potrebbe impostare nel file .php un aggiornamento delle tabelle in automatico, naturalmente ad una determinata ora?

    Devi usare un cron job per far partire il php al giorno/ora voluta. Se hai cPanel nel pannello di controllo trovi un'icona 'Cron jobs', scegli standard, imposta quando vuoi far partire l'update e metti come comando
    ** php -q -f /home/TuoUsername/LocazioneDelPhp/NomeDelPhp.php **
    o qualcosa di simile, dipende come e' organizzato il tuo server. Assicurati di avere i permessi per eseguire php.

    Ciao
    Bruno


  • User

    ho il php nuke 7.8, ma non ho nel cpanel un'icona "Cron jobs", dove posso trovarlo, cos'è un modulo per il nuke per gestire gli automatismi?

    Sarei interessato a saperne di più

    Grazie
    Nik


  • User

    @nik06 said:

    ho il php nuke 7.8, ma non ho nel cpanel un'icona "Cron jobs", dove posso trovarlo, cos'è un modulo per il nuke per gestire gli automatismi?
    Sarei interessato a saperne di più

    Stai lavorando in locale?
    cPanel e' il pannello di controllo (credo il piu' usato su server linux) che ti da modo di gestire il tuo spazio host. Niente a che vedere coi CMS o con PHP.

    Ciao
    Bruno


  • User

    Ciao Bruno,

    ritornando al discorso della percentuale ho adesso la necessità di tirar fuori i primi cinque risultati con la percentuale migliore ed i primi cinque risultati con la percentuale peggiore.

    Poichè la percentuale viene ricavata con una funzione che tipo di istruzione devo dare per ricavare per questo mini elenco diciamo di migliori e peggiori?

    Grazie

    Nik


  • User

    Ciao,
    SQL non fa calcoli tra singoli record quindi nel codice PHP dovrai tenerti da parte in un array i valori di percentuale trovati, ordinarli, e infine prendere quelli che ti servono.

    Ciao
    Bruno


  • User

    Mi potresti fare un esempio considerato che la percentuale si ricava con una funzione?

    Grazie ancora

    Nik06


  • User

    Prova a vedere se questo funziona
    Ciao
    Bruno

    [php]
    $Result=$db->sql_query('.....');
    $Percs=array();
    $Ticker=array();
    while ($Row = $db->sql_fetchrow($Result)) {
    $Percentuale=....;
    $Percs[]=$Percentuale;
    $Ticker[]=$Row['ticker'];
    // Altro
    }

    array_multisort($Percs, $Ticker);

    $NumEntry=count($Percs);

    // Le percentuali piu' basse
    for ($i=0; $i<5; $i++) {
    $out.='Ticker ' . $Ticker* . 'Perc: ' . number_format($Percs*, 2, '.', '') . '<br/>';
    }
    // Le percentuali piu' alte
    for ($i=$NumEntry-1; $i>$NumEntry-6; $i--) {
    $out.='Ticker ' . $Ticker* . 'Perc: ' . number_format($Percs*, 2, '.', '') . '<br/>';
    }

    [/php]