Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 54

Discussione: differenza mesi tra date

  1. #1
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito differenza mesi tra date

    Ciao

    In un campo di una tabella del db mysql ho inserito delle date nel formato date.

    Vorrei capire come stampare la data più vecchia e la più recente inserita, oltre a contare il numero di mesi (magari anche stamparli: una cosa del tipo 04/2010, 05/2010 ecc ecc) che intercorrono tra l'una e l'altra data.

    Grazie

  2. #2
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Per calcolare la differenza tra due dati prova a dare un'occhiata qui:

    http://www.mrwebmaster.it/php/artico...diff_1121.html

    Per stampare la data più vecchia credo che basti semplicemente prendere il timestamp delle due dati e confrontarli tra di loro, il timestamp minore dovrebbe essere quello della data più vecchia.

    Sevenjeak
    Software developer and much more

  3. #3
    Guest

    Predefinito

    Nella query che segue sostituisci
    - il nome del "campo_DATE"
    - il nome della "tabella"

    ... vedi che funzionerà...
    Codice:
    SELECT 
    	DATE_FORMAT( MAX(campo_DATE), '%e %c %Y')  AS data_max,
    	DATE_FORMAT( MIN(campo_DATE), '%e %c %Y')  AS data_min,
    	DATEDIFF( CONCAT( MAX( campo_DATE ), ' 00:00:00') , CONCAT( MIN( campo_DATE ), ' 00:00:00') ) AS differenza_in_mesi
    FROM  tabella

  4. #4
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    Nella query che segue sostituisci
    - il nome del "campo_DATE"
    - il nome della "tabella"

    ... vedi che funzionerà...
    Codice:
    SELECT 
    	DATE_FORMAT( MAX(campo_DATE), '%e %c %Y')  AS data_max,
    	DATE_FORMAT( MIN(campo_DATE), '%e %c %Y')  AS data_min,
    	DATEDIFF( CONCAT( MAX( campo_DATE ), ' 00:00:00') , CONCAT( MIN( campo_DATE ), ' 00:00:00') ) AS differenza_in_mesi
    FROM  tabella
    scusami.

    Ho fatto così:

    Codice PHP:
    $querymese = "SELECT
    DATE_FORMAT( MAX(datascad), '%e %c %Y') AS data_max,
    DATE_FORMAT( MIN(datascad), '%e %c %Y') AS data_min,
    DATEDIFF( CONCAT( MAX( datascad ), ' 00:00:00') , CONCAT( MIN( datascad ), ' 00:00:00') ) AS differenza_in_mesi
    FROM scadenze"
    ;

    $risultatomese = mysql_query($querymese);

    while (
    $recordmese = mysql_fetch_array($risultatomese)) {
    $mesemin = $recordmese["data_min"];
    $mesemax = $recordmese["data_max"];
    $diffmesi =$recordmese["differenza_in_mesi"];
    }

    echo
    "<br>$mesemin<br>$mesemax<br>$diffmesi";


    .............

    e mi stampa

    5 2 2011
    20 5 2011

    104

    va bene per i primi 2 risultati ma 104 sono giorni credo
    .
    E' possibile avere il risultato in mesi?
    In questo caso 4 in quanto i mesi interessati sono febbraio, marzo, aprile e maggio.

    Grazie
    Ultima modifica di gianlucaweb : 21-03-2011 alle ore 22.46.01

  5. #5
    Guest

    Predefinito

    Hai perfettamente ragione!
    ... però una ricerchina sul web no fa mai male...

    prova a sostituire DATE_DIFF con PERIOD_DIFF in questo modo... ma non ne sono certo che funzioni:
    Codice PHP:
    SELECT
    DATE_FORMAT
    ( MAX(campo_DATE), '%e %c %Y') AS data_max,
    DATE_FORMAT( MIN(campo_DATE), '%e %c %Y') AS data_min,
    PERIOD_DIFF( MIN( campo_DATE, MAX ( campo_DATE ) ) AS differenza_in_mesi
    FROM tabella

  6. #6
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    Hai perfettamente ragione!
    ... però una ricerchina sul web no fa mai male...

    prova a sostituire DATE_DIFF con PERIOD_DIFF in questo modo... ma non ne sono certo che funzioni:
    Codice PHP:
    SELECT
    DATE_FORMAT
    ( MAX(campo_DATE), '%e %c %Y') AS data_max,
    DATE_FORMAT( MIN(campo_DATE), '%e %c %Y') AS data_min,
    PERIOD_DIFF( MIN( campo_DATE, MAX ( campo_DATE ) ) AS differenza_in_mesi
    FROM tabella
    No non va.

    La funzione Period_diff vuole i parametri con solo anno e mese:

    PERIOD_DIFF(200802,200703);

    Sto provando diverse soluzioni ma mi da sempre errore.

    Grazie

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    No non va.

    La funzione Period_diff vuole i parametri con solo anno e mese:

    PERIOD_DIFF(200802,200703);

    Sto provando diverse soluzioni ma mi da sempre errore.

    Grazie
    e allora modifica le date DATE_FORMAT

  8. #8
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    e allora modifica le date DATE_FORMAT
    niente da fare nemmeno così:

    PERIOD_DIFF((DATE_FORMAT(MAX(datascad), '%Y%c'),(DATE_FORMAT(MIN(datascad), '%Y%c')) AS differenza_in_mesi

  9. #9
    Guest

    Predefinito

    Io ho sempre avuto qualche problemuccio a far gestire la differenza date a MySql, non so se perché non è lo strumento adatto o se per mia incapacità. In ogni caso, se vuoi affidare il compito al php (come faccio io per stare tranquillo), ti ho fatto uno scriptino volante. Vedi tu se usarlo, io ti dico cosa fare per provarlo.

    Le due date che ricavi dal DB le inserisci in altrettante variabili:

    $primaData="2008-02-08";
    $secondaData="2010-02-24";

    Poi copiaincolla:
    Codice PHP:
    $secondaDataSenzaGiorno=substr($secondaData,0,-3);

    $mese=substr($primaData,5,2); $anno=substr($primaData,0,4);

    $increData=0; $differenza=0;

    if (
    $primaData < $secondaData) {

    while (
    $increData < $secondaDataSenzaGiorno ) {
    $differenza++;
    $increData=date ("Y-m", mktime (0,0,0,$mese+$differenza,1,$anno) );
    echo
    $increData . "<br />";
    }
    echo
    "<br />I mesi di differenza tra la prima e la seconda data sono $differenza";
    }

  10. #10
    Guest

    Predefinito

    Codice:
    SELECT 
    DATE_FORMAT( MAX( datascad ) ,  '%e %c %Y' ) AS data_max, 
    DATE_FORMAT( MIN( datascad ) ,  '%e %c %Y' ) AS data_min, 
    PERIOD_DIFF( DATE_FORMAT( CONCAT( MAX( datascad ) ,  ' 00:00:00' ) ,  '%Y%m' ) , DATE_FORMAT( CONCAT( MIN( datascad ) ,  ' 00:00:00' ) ,  '%Y%m' ) ) AS differenza_in_mesi
    FROM scadenze
    ... questa dovrebbe funzionare... ma testala

  11. #11
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da webeginner Visualizza messaggio
    Io ho sempre avuto qualche problemuccio a far gestire la differenza date a MySql, non so se perché non è lo strumento adatto o se per mia incapacità. In ogni caso, se vuoi affidare il compito al php (come faccio io per stare tranquillo), ti ho fatto uno scriptino volante. Vedi tu se usarlo, io ti dico cosa fare per provarlo.

    Le due date che ricavi dal DB le inserisci in altrettante variabili:

    $primaData="2008-02-08";
    $secondaData="2010-02-24";

    Poi copiaincolla:
    Codice PHP:
    $secondaDataSenzaGiorno=substr($secondaData,0,-3);

    $mese=substr($primaData,5,2); $anno=substr($primaData,0,4);

    $increData=0; $differenza=0;

    if (
    $primaData < $secondaData) {

    while (
    $increData < $secondaDataSenzaGiorno ) {
    $differenza++;
    $increData=date ("Y-m", mktime (0,0,0,$mese+$differenza,1,$anno) );
    echo
    $increData . "<br />";
    }
    echo
    "<br />I mesi di differenza tra la prima e la seconda data sono $differenza";
    }
    ci ho rinunciato pure io ad usare mysql.
    Ho cambiato approccio per il momento.
    Ho risolto anche alcuni problemi nel frattempo.

    Mi interesserebbe capire ora come, avendo 2 date, posso riuscire ad ottenere la differenza in mesi non solo per quanto riguarda la quantità (cioè 4 mesi, 8 mesi ecc ecc) ma anche quali sono.

    Mi spiego inserendo 2 date del tipo

    04/11/2010
    15/03/2011
    mi servirebbe un output mese/anno da inserire poi in un array (poi spiego il perchè)
    del tipo:

    11/2010
    12/2010
    01/2011
    02/2011
    03/2011.

    si può fare?

    Grazie

  12. #12
    Guest

    Predefinito

    ma l'hai provata l'ultima query che ti ho dato?

    Inoltre con DATE_FORMAT puoi ottenere le date nel formato che ti pare.

    -------------------

    se invece vuoi gestire le date con php devi convertirle nel timestamp attraverso strtotime() o simili...

    se spieghi cosa vuoi ottenere ti si può dar una mano altrimenti diventa impossibile...

  13. #13
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    ma l'hai provata l'ultima query che ti ho dato?

    Inoltre con DATE_FORMAT puoi ottenere le date nel formato che ti pare.

    -------------------

    se invece vuoi gestire le date con php devi convertirle nel timestamp attraverso strtotime() o simili...

    se spieghi cosa vuoi ottenere ti si può dar una mano altrimenti diventa impossibile...

    si ho provato, non va. L'ho detto pure sopra e ho provato anche un'altra soluzione.
    Forse però ci sono quasi. Devo provare ancora. Vi faccio sapere. Una cosa terra terra ma potrebbe essere efficace.

    Il problema che mi sono proposto di risolvere è abbastanza complesso per le mie competenze, quindi, come faccio spesso, lo divido in problemi più piccoli e cerco informazioni e consigli per questi poi unisco il tutto e vedo come va.

    Il progetto principale prevede di stampare grafici fornendo date e importo (questi ultimi richiamati dal db).
    Se ho 2 date una di inizio e una finale mi serve sapere quanti mesi ci sono tra le 2 date e quali sono.

    Poi raggruppare gli importi dei documenti dello stesso giorno per ogni giorno del singolo mese e stampare il grafico del mese e così per ogni mese compreso nell'intervallo di tempo fornito dall'utente.

    Spero di essere stato chiaro. Come dicevo però forse ho trovato. Se continuate a darmi una mano per i piccoli problemi relativi alla sintassi del codice ce la dovrei fare.

    Grazie ancora.

  14. #14
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    Mi spiego inserendo 2 date del tipo

    04/11/2010
    15/03/2011
    Inserendo dove? Tu dal DB le ricavi in questo formato: 2010-11-04, non credo ti convenga fare un doppio salto mortale per tornare al punto di partenza. Lascia il dato come te lo restituisce la query e sei a posto.

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    mi servirebbe un output mese/anno da inserire poi in un array (poi spiego il perchè)
    del tipo:

    11/2010
    12/2010
    01/2011
    02/2011
    03/2011.

    si può fare?
    Cancella la riga
    Codice PHP:
    echo $increData . "<br />";
    e sostituiscila con:
    Codice PHP:
    echo substr($increData,5,2) . "/" . substr($increData,0,4) . "<br />";

  15. #15
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da webeginner Visualizza messaggio
    Inserendo dove? Tu dal DB le ricavi in questo formato: 2010-11-04, non credo ti convenga fare un doppio salto mortale per tornare al punto di partenza. Lascia il dato come te lo restituisce la query e sei a posto.


    Cancella la riga
    Codice PHP:
    echo $increData . "<br />";
    e sostituiscila con:
    Codice PHP:
    echo substr($increData,5,2) . "/" . substr($increData,0,4) . "<br />";

    aspetta.

    Una cosa è la data del documento contenuta nel db e caricata al momento della produzione del documento stesso
    e un'altra cosa le date inserite dall'utente nel form html per indicare l'intervallo di ricerca utile alla query select.

    Ciao e grazie

  16. #16
    Guest

    Predefinito

    Codice PHP:
    <?php
    // il max e il min veivano estratti correttamete... quindi lo lasciamo così com'è....
    // la differenza in mesi la rimuoviamo
    $querymese = "SELECT
    DATE_FORMAT( MAX(datascad), '%e %c %Y') AS data_max,
    DATE_FORMAT( MIN(datascad), '%e %c %Y') AS data_min
    FROM scadenze"
    ;

    $risultatomese = mysql_query($querymese);

    // il while non serve dato che i recordset estratto è unico
    $recordmese = mysql_fetch_array($risultatomese);
    // prendiamo i dati estratti
    $datamin = $recordmese["data_min"];
    $datamax = $recordmese["data_max"];

    // isoliamo le singole componenti che compongono la data
    list($giorno_min, $mese_min, $anno_min) = explode(' ', $datamin);
    list(
    $giorno_max, $mese_max, $anno_max) = explode(' ', $datamax);

    // otteniamo il timestamp min e max
    $timestamp_min = mktime(0, 0, 0, $mese_min, $giorno_min, $anno_min);
    $timestamp_max = mktime(0, 0, 0, $mese_max, $giorno_max, $anno_max);

    // differenza in mesi... qui è matematica...
    $diff_mesi = floor(($timestamp_max-$timestamp_min)/(60*60*24*30));
    echo
    $diff_mesi;

  17. #17
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    Codice PHP:
    <?php
    // il max e il min veivano estratti correttamete... quindi lo lasciamo così com'è....
    // la differenza in mesi la rimuoviamo
    $querymese = "SELECT
    DATE_FORMAT( MAX(datascad), '%e %c %Y') AS data_max,
    DATE_FORMAT( MIN(datascad), '%e %c %Y') AS data_min
    FROM scadenze"
    ;

    $risultatomese = mysql_query($querymese);

    // il while non serve dato che i recordset estratto è unico
    $recordmese = mysql_fetch_array($risultatomese);
    // prendiamo i dati estratti
    $datamin = $recordmese["data_min"];
    $datamax = $recordmese["data_max"];

    // isoliamo le singole componenti che compongono la data
    list($giorno_min, $mese_min, $anno_min) = explode(' ', $datamin);
    list(
    $giorno_max, $mese_max, $anno_max) = explode(' ', $datamax);

    // otteniamo il timestamp min e max
    $timestamp_min = mktime(0, 0, 0, $mese_min, $giorno_min, $anno_min);
    $timestamp_max = mktime(0, 0, 0, $mese_max, $giorno_max, $anno_max);

    // differenza in mesi... qui è matematica...
    $diff_mesi = floor(($timestamp_max-$timestamp_min)/(60*60*24*30));
    echo
    $diff_mesi;
    Ok grazie.

    Se l'utente non inserisce date potrò utilizzare questo script che in base alla data più vecchia e più recente preleva tutti i dati i dati presenti nel db.
    Adesso rimane il problema di eseguire la query per ogni mese.

    ciao

  18. #18
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    Adesso rimane il problema di eseguire la query per ogni mese.
    perdonami ma non ho capito...
    quale è il dato dinamico immesso dall'utente?
    e cosa voi estrarre dalla tabella?
    come si struttura la tabella?

  19. #19
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    perdonami ma non ho capito...
    quale è il dato dinamico immesso dall'utente?
    e cosa voi estrarre dalla tabella?
    come si struttura la tabella?
    Allora Ci sono (o dovrebbero esserci perchè ancora devo mettere nero su bianco, per il momento sto affrontando solo i problemi logici e scritto poco codice di prova secondo i vostri consigli..in ogni caso sto facendo anche riferimento ad un altro mio progetto già sviluppato molto simile e che utilizza le date) 2 campi nei quali l'utente può inserire 2 date,
    una per l'inizio della ricerca e un'altra finale quindi in pratica la query deve selezionare solo i documenti presenti nel db nell'intervallo indicato.
    Se non fornisce date e preme direttamente sul bottone di input lo script selezionerà tutti i record con la data più vecchia fino a quella più recente (e in questo caso posso utilizzare il tuo script per trovare la min e la max..non so ci sto ancora lavorando).
    La tabella è strutturata con campo :
    id
    numero documento
    descrizione
    importo
    data (di tipo date)

    ma per adesso è relativamente importante.

    Grazie ancora
    Ultima modifica di gianlucaweb : 23-03-2011 alle ore 20.06.10

  20. #20
    Guest

    Predefinito

    ok... chiaro.

    Vai per step: il primo consiste nella ricezione e validazione degli input degli utenti. A tal proposito ci sono degli ottimi plugin di jquery per selezionare le date. Questo è il primo che ho trovato:

    http://www.kelvinluck.com/assets/jqu...rPastDate.html

    quando lo hai implemetato correttamente passiamo agli step successivi...

  21. #21
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    ok... chiaro.

    Vai per step: il primo consiste nella ricezione e validazione degli input degli utenti. A tal proposito ci sono degli ottimi plugin di jquery per selezionare le date. Questo è il primo che ho trovato:

    http://www.kelvinluck.com/assets/jqu...rPastDate.html

    quando lo hai implemetato correttamente passiamo agli step successivi...
    si infatti utilizzo proprio il datapicker jquery.
    Tant'è vero che ho aperto un thread nella sezione javascript giusto un 'oretta fa:

    http://forum.it.altervista.org/javas...tml#post798721

    In pratica in min e max devo mettere le date con l'intervallo risultante utilizzando il tuo script

    Grazie

  22. #22
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    si infatti utilizzo proprio il datapicker jquery.
    In pratica in min e max devo mettere le date con l'intervallo risultante utilizzando il tuo script
    ... prima di chiedere è bene leggersi un pò la documentazione dello script...
    http://www.kelvinluck.com/assets/jqu...yPastDate.html

    comunque...

    ... ora imposta il method del form con POST e verifica nella pagina ricevente in che formato le date vengono inviate... e cosa invia nel caso di mancata selezione della data.
    Per fare tali test nella pagina che riceve i dati ti basterà scrivere

    Codice PHP:
    <?php
    echo '<pre>';
    print_r($_POST);
    echo
    '</pre>';
    ?>
    fai questi test... e poi posta qui i risultati ottenuti.

  23. #23
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    ... prima di chiedere è bene leggersi un pò la documentazione dello script...
    http://www.kelvinluck.com/assets/jqu...yPastDate.html

    comunque...

    ... ora imposta il method del form con POST e verifica nella pagina ricevente in che formato le date vengono inviate... e cosa invia nel caso di mancata selezione della data.
    Per fare tali test nella pagina che riceve i dati ti basterà scrivere

    Codice PHP:
    <?php
    echo '<pre>';
    print_r($_POST);
    echo
    '</pre>';
    ?>
    fai questi test... e poi posta qui i risultati ottenuti.


    mah funziona semplicemente anche una cosa del genere:

    Codice:
    $min = -4
    
    ....
    
    $(function() {
    		$( "#datepicker" ).datepicker({ minDate: <?echo $min?>, maxDate: "+1M +10D" });
    solo come esempio.
    Poi la differenza in giorni richiesta me la posso trovare facendo la differenza tra la data attuale e quella più vecchia.
    Per il resto ci penso domani.

    Grazie

  24. #24
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    ok. Ho risolto la faccenda del datapicker:

    Codice PHP:

    .............

    $querymese = "SELECT
    DATE_FORMAT( MAX(datascad), '%e %c %Y') AS data_max,
    DATE_FORMAT( MIN(datascad), '%e %c %Y') AS data_min
    FROM scadenze";

    $risultatomese = mysql_query($querymese);

    // il while non serve dato che i recordset estratto è unico
    $recordmese = mysql_fetch_array($risultatomese);
    // prendiamo i dati estratti
    $datamin = $recordmese["data_min"];
    $datamax = $recordmese["data_max"];

    function conv_date ($data)
    {
    list ($d, $m, $y) = explode (" ", $data);
    return "$d/$m/$y";
    }

    $min = conv_date ($datamin);
    $max = conv_date ($datamax);
    ................

    <script>
    $(function() {
    $( "#datepicker_dal" ).datepicker({ minDate: "<?php echo $min?>", maxDate: "<?php echo $max ?>" });
    $( "#datepicker_al" ).datepicker({ minDate: "<?php echo $min?>", maxDate: "<?php echo $max ?>" });
    });
    </script>
    Adesso vengono visualizzate nel datapicker solo le date che sono comprese nell'intervallo di tempo in cui sono presenti i documenti con le varie scadenze.

    Adesso devo capire come produrre i grafici mese per mese rispetto all'intervallo di tempo selezionato.

    Ci sto lavorando.

    Grazie

  25. #25
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    ok. Ho risolto la faccenda del datapicker:
    Adesso devo capire come produrre i grafici mese per mese rispetto all'intervallo di tempo selezionato.
    Come devono essere costruiti i grafici?
    cioè quali dati devi riassumere in un grafico?

  26. #26
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    Come devono essere costruiti i grafici?
    cioè quali dati devi riassumere in un grafico?

    Non mi interessa tanto il codice del grafico in se.
    Utilizzo la libreria Libchart per questo.
    Il problema vero e proprio è inviare dati corretti alla query che deve essere eseguita ciclicamente e seconda dei mesi coinvolti nell'intervallo di tempo.

    Con questo codice non faccio altro che sommare tutti gli importi del mese che entra nel periodo considerato producendo poi un grafico a barre verticali (una per ogni mese). Gli importi che non rientrano nell'intervallo non vengono sommati.

    Codice PHP:
    ....

    $querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%m/%Y') mese FROM scadenze where
    datascad >= str_to_date('
    $inizio', '%d/%m/%Y') and datascad <= str_to_date('$fine', '%d/%m/%Y') GROUP BY mese order by datascad";

    $risultato = mysql_query($querystat);

    $chart = new VerticalBarChart(500,250);

    $dataSet = new XYDataSet();

    while (
    $record = mysql_fetch_array($risultato)) {
    $mese = $record["mese"];
    $totimp = $record["somma"];

    $dataSet->addPoint(new Point("$mese", $totimp));
    }
    $chart->setDataSet($dataSet);
    $chart->setTitle("Dati mese/totali x mese");
    $chart->render("generated/demo1.png");


    echo
    "<img alt=\"Vertical bars chart\" src=\"generated/demo1.png\" style=\"border: 2px solid gray;\"/>";
    }
    ...
    le date sono fornite dai datapicker.

    Con quest'altro codice invece produco il grafico del mese con tutti i giorni dove sono presenti operazioni (se ce ne sono più di una nello stesso giorno gli importi sono sommati):

    Codice PHP:
    ....
    $querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%d/%m/%Y') giorno FROM scadenze
    where YEAR(datascad) =
    $anno AND MONTH(datascad) = $mese GROUP BY giorno ORDER BY datascad";
    $risultato = mysql_query($querystat);

    $chart = new VerticalBarChart(500,250);

    $dataSet = new XYDataSet();

    while (
    $record = mysql_fetch_array($risultato)) {
    $mese = $record["giorno"];
    $totimp = $record["somma"];

    $dataSet->addPoint(new Point("$mese", $totimp));
    }
    $chart->setDataSet($dataSet);

    $chart->setTitle("Dati giorno/totali x mese");
    $chart->render("generated/demo1.png");
    ?>
    ..
    Quello che voglio ottenere è una specie di fusione delle 2 query.

    Produrre il grafico del mese con tutti i giorni (come nella seconda query),
    uno per ogni mese che entri nell'intervallo di tempo selezionato nei datapicker
    escludendo però i giorni che sono fuori intervallo temporale.

    Ad esempio se come inizio data seleziono 15/12/2010 e nel mese considerato ci sono molte operazioni prima del 15/12 e solo una (o che so io 4 0 5 nello stesso giorno) fino al 31/12 produrre in ogni caso il grafico di dicembre 2010
    ma solo col giorno con gli importi dopo il 15.

    Ammesso che sia possibile (che sia utile o meno adesso ha un'importanza relativa. Lo sto facendo per esercitazione, poi magari nella realtà potrà essere utile produrre il grafico dell'intero mese con tutti gli importi...comuqnue) stavo pensando di far entrare la query con la produzione del grafico in un ciclo for o foreach che prendano in considerazione quanti mesi sono interessati e "ciclare"
    per ogni mese la query ; quest'ultima con le caratteristiche di cui sopra.

    Spero di essere stato chiaro (in pratica mi manca solo questo passaggio e un po' di rifiniture).

    Grazie per la disponibilità e la pazienza

    Ciao
    Ultima modifica di gianlucaweb : 24-03-2011 alle ore 21.50.17

  27. #27
    Guest

    Predefinito

    In tutta onesta, non avendo la tabella sottomano per fare delle prove con phpmyadmin è difficile risponderti.

    Cmq sia la soluzione più sbrigativa e semplice è quella di fare il ciclo uno per ogni mese compreso nell'intervallo (sempre che i mesi non siano moltissimi...)

  28. #28
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    In tutta onesta, non avendo la tabella sottomano per fare delle prove con phpmyadmin è difficile risponderti.

    Cmq sia la soluzione più sbrigativa e semplice è quella di fare il ciclo uno per ogni mese compreso nell'intervallo (sempre che i mesi non siano moltissimi...)
    Perchè?
    Se sono molti diventa pesante l'operazione?

    Grazie

  29. #29
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb Visualizza messaggio
    Perchè?
    Se sono molti diventa pesante l'operazione?

    Grazie
    ... bhè... nulla di chè... però cerchi di mantenerti massimo a 10 cicli (circa) se devi farne 20-30 allora diventa pesantino... se poi andiamo sulle centinaia io eviterei assolutamente

  30. #30
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da miniscript Visualizza messaggio
    ... bhè... nulla di chè... però cerchi di mantenerti massimo a 10 cicli (circa) se devi farne 20-30 allora diventa pesantino... se poi andiamo sulle centinaia io eviterei assolutamente

    centinaia penso di escluderlo come caso (magari faccio un controllo preventivo sull'input...ma non penso sia necessario ripeto).
    15-20 probabilmente sarà il caso più comune.
    ma non vedo soluzioni alternative però.
    Ciao

    aggiorno la situazione:


    Sono comunque quasi alla resa dei conti. Ho inserito la query in un foreach:

    Codice PHP:

    ................

    function
    ricerca($inizio, $fine){

    function
    conv_dateun ($data)
    {
    list (
    $d, $m, $y) = explode ("/", $data);
    return
    "$m/$y";
    }

    //++++conversione formato date con php
    function conv_date_anno ($data)
    {
    list (
    $m, $y) = explode ("/", $data);
    return
    "$y";
    }

    function
    conv_date_mese ($data)
    {
    list (
    $m, $y) = explode ("/", $data);
    return
    "$m";
    }
    //***********************

    $prima = conv_dateun ($inizio);


    $secondaDataSenzaGiorno=substr($fine,3,7);
    $mese=substr($inizio,3,3); $anno=substr($inizio,6,4);

    $increData=0; $differenza=0;
    $mesitot = array();
    $mesitot[] = $prima;

    if (
    $inizio < $fine) {

    while (
    $increData < $secondaDataSenzaGiorno ) {
    $differenza++;
    $increData=date ("m/Y", mktime (0,0,0,$mese+$differenza,1,$anno) );
    $mesi_s= substr($increData,0,2) . "/" . substr($increData,3,4) . "<br />";
    $mesitot[] = $mesi_s;
    }
    }


    $i = 0;
    foreach(
    $mesitot as $valore)
    {

    $anno = conv_date_anno ($valore);
    $mese = conv_date_mese ($valore);

    $querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%d/%m/%Y') giorno FROM scadenze
    where YEAR(datascad) =
    $anno AND MONTH(datascad) = $mese GROUP BY giorno ORDER BY datascad";
    $risultato = mysql_query($querystat);

    $chart = new VerticalBarChart(500,250);

    $dataSet = new XYDataSet();

    while (
    $record = mysql_fetch_array($risultato)) {
    $giorno = $record["giorno"];
    $totimp = $record["somma"];

    $dataSet->addPoint(new Point("$giorno", $totimp));
    }
    $chart->setDataSet($dataSet);

    $chart->setTitle("Dati giorno/totali x mese");
    $chart->render("generated/demo.$i.png");


    echo
    "<img alt=\"Vertical bars chart\" src=\"generated/demo.$i.png\" style=\"border: 2px solid gray;\"/>";
    echo
    "<br>";
    $i ++;
    }
    }
    ....
    Vabbè il codice è un po' disordinato, metterò a posto tutto dopo includendo una pagina con tutte le funzioni utilizzate e lasciando solo la parte logica.

    La funzione ricerca riceve le 2 date che rappresentano l'intervallo temporale.
    Trovo i mesi interessati dalla ricerca e li inserisco in un array dove prima ho inserto anche il mese iniziale di ricerca, poi in un foreach provo (l'intenzione era quella) ad eseguire la query tante volte quanti sono gli elementi dell'array.....ma c'è qualcosa che va storto.
    Gli elementi dell'array ci sono e sono corretti (ho fatto degli echo di prova).
    La query stampa correttamente il grafico del primo mese ma poi pe gli altri mesi viene stampato un messaggio di errore per ogni riga. Il messaggio è questo:

    "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\graf\stat\data.php on line 130"

    la linea 130 in questione è questa:

    Codice:
    while ($record = mysql_fetch_array($risultato)) {
    ma forse l'errore è a monte.
    Ci sono a dire la verità anche altre cose da sistemare..ma una cosa per volta.
    Qual'è l'errore?

    Grazie
    Ultima modifica di gianlucaweb : 25-03-2011 alle ore 18.32.08

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •