Query in base alla data

  • Creatore Discussione Creatore Discussione max_400
  • Data di inizio Data di inizio

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
Ciao a tutti...

Devo fare un database con un campo di ricerca
in modo che un impiegato scriva la data in un intervallo
dal 01-08-11 a 08-08-11.

Quindi un semplice form dove si inserisce la data
e una semlice query che estragga i dati.

Cortesemente se potete darmi uno script semplice
e già testato perchè per ora sto lavorando e non ho tempo
di sperimentare.

Grazie.
by max_400
 
ciao
lavorare con le date è quasi sempre un casino, soprattutto se l'inserimento è libero.
secondo me ti conviene cercarti prima un data picker in modo che la data sia inserita sempre in un unico modo.
o fare delle select con scelta obbligata
es. se l'inserimento è libero uno può inserire
8 agosto 2011
8-8-11
08/08/2011
ecc..
se non addirittura
31 febbraio 2011
poi quando devi registrarla e poi soprattutto cercarla entri nelle pegole
 
Ciao
io uso questa soluzione
PHP:
<?php
        if (isset($_POST['cerca']) && $_POST['cerca'] == 'Cerca') {
            $d_day = $_POST['d_day'];
            $d_month = $_POST['d_month'];
            $d_year = $_POST['d_year'];
            $a_day = $_POST['a_day'];
            $a_month = $_POST['a_month'];
            $a_year = $_POST['a_year'];
            if (checkdate($d_month, $d_day, $d_year)) {
                $dal = "$d_year-$d_month-$d_day";
                if (checkdate($a_month, $a_day, $a_year)) {
                    $al = "$a_year-$a_month-$a_day";
                    $query = "SELECT * FROM tabella 
                                   WHERE Data BETWEEN '$dal' AND DATE_ADD('$al',INTERVAL 1 DAY)";
                    //qui la query andrà eseguita
                    echo $query;
                } else {
                    echo "<script type='text/javascript'>
                            alert('La seconda data non è valida');
                          </script>";
                }
            } else {
                echo "<script type='text/javascript'>
                         alert('La prima data non è valida');
                      </script>";
            }
        } else {
            $d_day = '01';
            $d_month = date('m');
            $d_year = date('Y');
            $a_day = date('d');
            $a_month = date('m');
            $a_year = date('Y');
        }

        $mesi = array(1, 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio',
            'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');

        echo "<form action='test.php' method='post'>";
        echo "<div class='mioForm'>";
        echo "Dal&nbsp;&nbsp;&nbsp;<select name='d_day'>";
        for ($i = 1; $i < 32; $i++) {
            $i = str_pad($i, 2, '0', STR_PAD_LEFT);
            echo "<option value='$i'";
            if ($d_day == $i)
                echo " selected='selected'";
            echo ">$i</option>\n";
        }
        echo "</select>&nbsp;&nbsp;&nbsp;";

        echo " <select name='d_month'>";
        for ($x = 1; $x < 13; $x++) {
            $xx = str_pad($x, 2, '0', STR_PAD_LEFT);
            echo "<option value='$xx'";
            if ($d_month == $xx) {
                echo " selected='selected'";
            }
            echo ">$mesi[$x]</option>\n";
        }
        echo "</select>&nbsp;&nbsp;&nbsp;";

        echo "<select name='d_year'>";
        for ($y = 2000; $y <= date('Y'); $y++) {
            echo "<option value='$y'";
            if ($d_year == $y)
                echo " selected='selected'";
            echo ">$y</option>\n";
        }
        echo "</select>&nbsp;&nbsp;&nbsp;";



        echo "Al&nbsp;&nbsp;&nbsp;<select name='a_day'>";
        for ($i = 1; $i < 32; $i++) {
            $i = str_pad($i, 2, '0', STR_PAD_LEFT);
            echo "<option value='$i'";
            if ($a_day == $i)
                echo " selected='selected'";
            echo ">$i</option>\n";
        }
        echo "</select>&nbsp;&nbsp;&nbsp;";

        echo " <select name='a_month'>";
        for ($x = 1; $x < 13; $x++) {
            $xx = str_pad($x, 2, '0', STR_PAD_LEFT);
            echo "<option value='$xx'";
            if ($a_month == $xx) {
                echo " selected='selected'";
            }
            echo ">$mesi[$x]</option>\n";
        }
        echo "</select>&nbsp;&nbsp;&nbsp;";

        echo "<select name='a_year'>";
        for ($y = 2000; $y <= date('Y'); $y++) {
            echo "<option value='$y'";
            if ($a_year == $y)
                echo " selected='selected'";
            echo ">$y</option>\n";
        }
        echo "</select>&nbsp;&nbsp;&nbsp;";
        echo "<input type='submit' value='Cerca' name='cerca'/>";

        echo "</div>";
        echo "</form>";

        // se la query viene eseguita mostro i risultati
        if ($query) {
            echo "Risultati della query";
        }
        ?>
Non controllo se la seconda data sia maggiore della prima perchè in caso contrario mysql dovrebbe semplicemente restituire un insieme vuoto.
Comunque si può sempre aggiungere.
Non sarà il massimo considerando che non uso javascript, ma il suo lavoro lo fa!
 
Quanti scarabocchi....

....ho trovato un sistema più semplice.

Basta modificare il campo data in semplice testo "VARCHAR"
ed applicare il BETWEEN

scad-intervallo.jpg

ecco qui il link esempio
basta mettere dal 01-08-11 al 05-08-11

PHP:
$dal=htmlspecialchars($_POST['dal']);
$al=htmlspecialchars($_POST['al']);

include("dati-per-la-connessione-al-database.php");

$query = "SELECT `data_inizio`,`quantita`,`tipo`,`descrizione`,`scadenza`,`pagam`,`altro` FROM `nome_tabella` WHERE scadenza BETWEEN '$dal' AND '$al' ORDER BY scadenza";
 
....ho trovato un sistema più semplice.

Basta modificare il campo data in semplice testo "VARCHAR"
ed applicare il BETWEEN

scad-intervallo.jpg

ecco qui il link esempio
basta mettere dal 01-08-11 al 05-08-11

PHP:
$dal=htmlspecialchars($_POST['dal']);
$al=htmlspecialchars($_POST['al']);

include("dati-per-la-connessione-al-database.php");

$query = "SELECT `data_inizio`,`quantita`,`tipo`,`descrizione`,`scadenza`,`pagam`,`altro` FROM `nome_tabella` WHERE scadenza BETWEEN '$dal' AND '$al' ORDER BY scadenza";

Ciao ho provato a testare il tuo script, ma non da grandi risultati, forse potrebbe essere migliorato
01-07-11 al 25-07-11 non da i risultati sperati, poi quel (11) che sarebbe l'anno lo modificherei in 2011.
Forse è meglio inserire un calendario js e far scegliere la data
Ciao buon lavoro
 
Ultima modifica:
anche considerando che le date vengano inserite sempre nel modo corretto,

usando varchar per definire il campo data, una ricerca di questo tipo (dal 25-07-11 al 02-08-11) non funzionerà

perchè per mysql 25-07-11 sarà maggiore di 02-08-11

Non ho provato ma in teoria è così.

Considera piuttosto di memorizzare nel db le date nel formato unix,
dovrai poi trasformare le date recuperate dal form in secondi,
cosi l'esempio di prima dovrebbe funzionare, sempre che la data venga inserita nel formato che ti aspetti.
 
eh si... effettivamente...

avevo fatto solo 2 prove
dall' 01-08-11 al 05-08-11 e dall' 01-08-11 al 13-08-11
e mi dava i risultati giusti. Quindi avevo chiuso l'argomento
ma alì mortè dall'1 -8 al 31 mi da anche quelli di luglio mortacci sua
mi serviva qualkosa di semplice e veloce da realizzare...

Ma forse mi è venuta un'idea... cioè eliminare i manifesti di luglio e creare un'altra tabella a parte
mò provo...

au revoir
 
Fatto!!

sembra funzionare.... ho duplicato la tabella ed ho eliminato quelli di luglio

between3-agosto.php

e questi sono tutti
select-tutti-agosto.php

ovviamente se faccio una tabella per ogni mese mi sembra superfluo mettere 08-11 oppure 08-2011
per velocizzare le operazioni di ricerca basta semplicemente mettere il giorno di inizio e quello di fine

Naturalmente in seguito per altre applicazioni sarò costretto ad utilizzare il sistema del dottor criric
se trovate delle scorciatoie più brevi non esitate a rispondere

Grazie per l'attenzione... onorevoli!
by max_400
 
ciao
usa il timestamp tipo unix è quello che poi da meno problemi, sia per gli ordinamenti che gli intervalli e relativi calcoli (es tra tre mesi = timestamp + 60*60*60*24*30), poi quando la devi visualizzare la trasformo in data tipo umano con
echo date("d m Y";$formato_timestamp);
nel db la data int(15)
 
il gattoooooooooo.... è tornato il gatto!!!

Signor gattino... ormai ho creato 3 tabelle in quel modo:
luglio - agosto - e oggi ho fatto settembre.
Ma il mio lavoro è ormai finito a Settembre sono fuori
ed il database sarà abbandonato.

Però dal punto di vista della curiosità io farei:
Dividere giorno e mese (2 elementi) e cosi non ci dovrebbero essere problemi
utilizzando gli operatori And e Where quindi 2 campi o sarebbe meglio 3 (per l'anno)
ho trovato questo esempio nei miei appunti:

PHP:
Adesso vogliamo selezionare solo le persone con il nome uguale a “Andrea” e il cognome uguale a “Rossi”:
Usiamo la seguente istruzione SELECT:

SELECT * FROM Persone
WHERE Nome='Andrea'
AND Cognome='Rossi'

dove il campo nome lo possiamo modificare in giorno
ed il campo cognome in mese
e cosi non ho bisogno di fare 3 tabelle.

E poi bisogna vedere come inserire il between...
Tutto ipoteticamente... Che ne dici? :book:

(il gatto dà credenza... quello che fa pensa!)
 
ciao
credo che sia un metodo perfetto per complicarsi la vita.
sarò noioso, ma l'uso del timestamp per me è il migliore per risolvere tutti (o quasi) i problemi.
 

Discussioni simili