Creare un query "complessa" con 2 date .....

Ho un database che contiene una tabella con gli eventi e le manifestazioni ... ho creato una pagina nella quale vorrei che mi venissero visualizzati solo gli eventi del compresi tra la data odierna e la data fine + 30 giorni ordinandoli per data inizio in modo crescente .....

il codice di base è questo :

"SELECT * FROM eventi_dati ORDER BY dt_iniz_eve ASC"

non so come iniziare a modificare ... chi mi aiuta??

inviato 10 anni fa
ninext
X 0 X

select * form eventi_dati where data>=$datainizio and data <= $datafine order by dt_iniz_eve ASC;

(data->campo che contiene la data nel db, meglio precisare!)

risposto 10 anni fa
LonelyWolf
X 0 X

le date le estraggo dal db in formato italiano con il DATEFORMAT ... quindi gg/mm/aaaa

risposto 10 anni fa
ninext
X 0 X

Non so come hai impostato il campo che contiene la data nel db, per cui questa è una possibile soluzione.

$datainizio = time(); //unix timestamp

$datafine = time()+(30*24*60*60 ); //data di oggi più 30gg in secondi (gg*ore*minuti*secondi)

A questo punto non ti resta altro che impostare le date con date per averle nel formato che preferisci tu (o che hai nel db).

Personalmente io lavoro con le date in timestamp nel db, molto più comodo registrando anche ore e minuti.

La select è poi quella che ti ho postato prima.

risposto 10 anni fa
LonelyWolf
X 0 X

Se ho il la query composta così

"SELECT id_evento, DATE_FORMAT(dt_iniz_eve, '%d/%m/%Y') AS dt_iniz_eve_it, DATE_FORMAT(dt_fine_eve, '%d/%m/%Y') AS dt_fine_eve_it, nome_eve FROM eventi_dati ORDER BY dt_iniz_eve_it ASC";

come formatto allo stesso modo data odierna e data fine + 30 giorni nel formato gg/mm/aaaa .... non ho capito come iniziare

risposto 10 anni fa
ninext
X 0 X

Se ho il la query composta così

"SELECT id_evento, DATE_FORMAT(dt_iniz_eve, '%d/%m/%Y') AS dt_iniz_eve_it, DATE_FORMAT(dt_fine_eve, '%d/%m/%Y') AS dt_fine_eve_it, nome_eve FROM eventi_dati ORDER BY dt_iniz_eve_it ASC";

come formatto allo stesso modo data odierna e data fine + 30 giorni nel formato gg/mm/aaaa .... non ho capito come iniziare

.... per definiere la data odierna e quella odierna + 30 giorni faccio così ..... ma non funziona .. o meglio la seconda data non me la incrementa di 30 gg

<?php 
$dtinizinterv = date ("d/m/Y"); // Catturo la data odierna per definire l'inizio dell'intervallo
$dtfineinterv = date("d/m/Y",mktime(date("d")+30,date("m"),date("Y")));
?>
risposto 10 anni fa
ninext
X 0 X
<?php 
$dtinizinterv = date ("d/m/Y"); // Catturo la data odierna per definire l'inizio dell'intervallo
$dtfineinterv = date("d/m/Y",mktime(0,0,0,date("m"),date("d")+30,date("Y")));
?>

http://it.php.net/manual/it/function.mktime.php

int mktime ( int hour, int minute, int second, int month, int day, int year [, int is_dst] )

solo l'ulitmo parametro è opzionale, gli altri no

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

cosi però pare che mi definisca le date come voglio ...

<?php 
$dtinizinterv = date ("d/m/Y"); // Catturo la data odierna per definire l'inizio dell'intervallo
$dtfineinterv = date("d/m/Y",mktime(date("d")+(24*30),date("m"),date("Y")));
?>

anche perchè se provo s stampare $dtinizinterv e $dtfineinterv  mi restituisce   12/07/2006  e 11/08/2006

Ammesso che questo problema sia superato ... come recupero $dtinizinterv e $dtfineinterv   nella query per imporre la condizione di cui parlava in precedenza.

risposto 10 anni fa
ninext
X 0 X

Nessuno mi da una mano???

Sono più chiaro in ciò che intendo ottenere:

Devo estrarre dei record dal db per i quali la dt_iniz_eve è maggiore o uguale a $dtinizinterv e minore o uguale a $dtfineinterv

Ho definito le variabili e poi ho impostato la query .... ma sulla query i record restituiti non sono corretti ...

il codice è il seguente:

<?php 
$dtinizinterv = date ("d/m/Y"); 
$dtfineinterv = date("d/m/Y",mktime(date("d")+(24*30),date("m"),date("Y")));
?>
"SELECT id_evento, DATE_FORMAT(dt_iniz_eve, '%d/%m/%Y') AS dt_iniz_eve_it, 
DATE_FORMAT(dt_fine_eve, '%d/%m/%Y') AS dt_fine_eve_it, nome_eve 
FROM eventi_dati WHERE dt_iniz_eve >= '$dtinizinterv' AND dt_iniz_eve <= '$dtfineinterv' ORDER BY dt_iniz_eve_it ASC"

Dove sbaglio??

risposto 10 anni fa
ninext
modificato 10 anni fa
X 0 X

Che errore ricevi?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Non mi restituisce i record che rientrano in quella condizione.

Ad esempio:

ho un evento che ha come data inizio 20/07/2006 e data fine 30/07/2006 .... dovrebbe essere restituto il record .... ma non c'è!

risposto 10 anni fa
ninext
X 0 X

hai un client MySQL installato, tipo MySQL query browser o phpmyadmin? Prova ad eseguire la query prima da client e vedi se hai gli stessi problemi

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

cmq usi in modo sbagliato mktime, probabilmente il problema sta in questo.

$dtfineinterv = date("d/m/Y",mktime(0,0,0,date("m"),date("d")+(24*30),date("Y")));

risposto 10 anni fa
LonelyWolf
X 0 X

Avrei una alternativa che fa fare tutto nella select:

"SELECT id_evento, DATE_FORMAT(dt_iniz_eve, '%d/%m/%Y') AS dt_iniz_eve_it, 
DATE_FORMAT(dt_fine_eve, '%d/%m/%Y') AS dt_fine_eve_it, nome_eve 
FROM eventi_dati WHERE dt_iniz_eve >= curdate() + interval 30 day ASC;"
risposto 10 anni fa
LonelyWolf
X 0 X

modificando il mktime ... come soggerito, se provo a stamapre $dtfineinterv mi restituisce la data del 02/07/2008 e comunque la query non mi da nessun risultato (nessun record estratto).

Ho provato anche il secondo suggerimento .... il select non mi restituisce i record che mi aspetto .... e che mi dovrebbe dare ( ad esempio un evento con con inizio 01/09/2006 e fine 02/09/2006 me lo visualizza .... un'altro con inizio 20/07/2006 e fine 30/07/2006 no)

Cosa può essere ....??

risposto 10 anni fa
ninext
X 0 X

  ... nessun guru che mi da una mano???

risposto 10 anni fa
ninext
X 0 X

Scusa l'assenza, ma sono un po' oberato di lavoro e non sono nemmeno un guru!

Allora facciam un breve riassunto altrimenti mi perdo:

dt_iniz_eve è il campo che contiene la data dell'evento in unix timestamp?

Prova a fare la query così, senza troppi fronzoli.

"SELECT id_evento, dt_iniz_eve, dt_fine_eve, nome_eve FROM eventi_dati WHERE dt_iniz_eve >= curdate() + interval 30 day ASC;"
risposto 10 anni fa
LonelyWolf
X 0 X

... non riesco a vedere per intero il codice che mi hai postato ..

risposto 10 anni fa
ninext
X 0 X

E' solo la select:

"SELECT id_evento, dt_iniz_eve, dt_fine_eve, nome_eve FROM eventi_dati WHERE dt_iniz_eve >= curdate() + interval 30 day ASC;"

risposto 10 anni fa
LonelyWolf
X 0 X

... mi manca sempre un record dal risultato!

In pratica l'evento che manca ha nel db data inizio = 20/07/2006 e data fine 30/07/2006 ... quindi dovrebbe restituirmelo!

Comunques le date sono memorizzate nel db come campo date 0000-00-00 , poi quando le estraggo faccio il FORMATDATE .....

In pratica nemmeno così ho risolto  .... non hai un suggerimento da darmi per avere magari lo stesso risultato ????

risposto 10 anni fa
ninext
X 0 X

A questo punto l'unica cosa che mi viene in mente è:

Sei sicuroi che l'evento ha come data di inizio inserita: 2006-07-20 ?

In qualsiasi caso, la puoi ricontrollare?

risposto 10 anni fa
LonelyWolf
X 0 X

Questa è la tabella come me la restituisce phpMyAdmin

    id_evento        dt_iniz_eve    dt_fine_eve       nome_eve       descr_eve                                        idcat_eve 

      1                    2006-07-12     2006-07-14     Evento n. 1 descrizione evento ed eventuali immagini 1

      2                    2006-09-01     2006-09-02     Evento n. 2 Descrizione Evento ed eventuali immagini 3

      3                    2006-07-10       NULL              Evento n. 3 NULL                                                          5

      4                    2006-07-20     2006-07-30      aa               NULL

risposto 10 anni fa
ninext
X 0 X

Mi è venuto un dubbio, prova questa query:

"SELECT id_evento, dt_iniz_eve, dt_fine_eve, nome_eve FROM eventi_dati WHERE dt_iniz_eve >= curdate() and dt_iniz_eve <= curdate() + interval 30 day ASC;

risposto 10 anni fa
LonelyWolf
X 0 X

Adesso funziona!!!! ..... comunque provo a fare alcuni inserimenti nel db e vedo se il risultato è sempre corretto.

Grazie ancora per la pazienza!

.... ti chiedo ancora, giacchè mi trovo, se voglio limitare i record a 5 .... ovvero solo 5 record tra quelli che mi ha estratto con quella query ..... come faccio ??? So che si usa LIMIT 5 .... a fine query ..... è corretto??

risposto 10 anni fa
ninext
X 0 X

prima di mettere ASC.

risposto 10 anni fa
LonelyWolf
modificato 10 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda

Domande simili