[risolto] Query e date! Sto impazzendo

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
Buongiorno e buon anno a tutti,
ho un piccolo problema con una query che per voi potrà essere banale ma io provo e riprovo e non ci riesco..
Ho una tabella che contiene degli eventi e per ognuno di questi c'è un timestamp di inizio e uno di fine..
chiamando la pagina /page.php?day=03&month=01&year=2014 vorrei selezionare con la query non solo gli eventi che iniziano in un determinato giorno ma anche quelli che ad esempio iniziano il 02 gennaio e finiscono il 03...
Questo è quello che ho provato:
Codice:
SELECT * FROM events WHERE (CURDATE() BETWEEN DATE(inizio) AND DATE(fine))
Non ho idea di come altro fare e se non è chiaro qualcosa chiarirò meglio... in ogni caso grazie a tutti in anticipo :D

P.S. vorrei inoltre che l'evento, se ad esempio finisse il 03 alle 12:00, sarebbe visibile per tutta la giornata e non fino alle 12:00....vorrei quindi filtrarli per data e non ora
 
ciao
se non ho capito male tu hai la tabella events dove hai anche due campi "inizio" e "fine" espressi in timestamp
e chiami la pagina /page.php?day=03&month=01&year=2014
prova così
PHP:
<?php
//.......
$gg=(int)$_GET['day'];
$mm=(int)$_GET['month'];
$gg=(int)$_GET['year'];
//trasformi in timestamp
$ini=mktime(0,0,0,$mm,$gg,$aa);//ore 0:0:0 del $gg/$mm/$aa
$fin=mktime(23,59,59,$mm,$gg,$aa)+(24*60*60);// mezzanotte del  $gg+1/$mm/$aa
$query="SELECT * FROM events WHERE inizio >=$ini AND fine <= $fin";
//.....
?>
 
ciao
se non ho capito male tu hai la tabella events dove hai anche due campi "inizio" e "fine" espressi in timestamp
e chiami la pagina /page.php?day=03&month=01&year=2014
prova così
PHP:
<?php
//.......
$gg=(int)$_GET['day'];
$mm=(int)$_GET['month'];
$gg=(int)$_GET['year'];
//trasformi in timestamp
$ini=mktime(0,0,0,$mm,$gg,$aa);//ore 0:0:0 del $gg/$mm/$aa
$fin=mktime(23,59,59,$mm,$gg,$aa)+(24*60*60);// mezzanotte del  $gg+1/$mm/$aa
$query="SELECT * FROM events WHERE inizio >=$ini AND fine <= $fin";
//.....
?>

Ciao grazie per la risposta!
In realtà ho provato questo precedentemente... il fatto è che questa query restituisce sono gli eventi che iniziano e si concludono nello stesso giorno!
Se quindi volessi selezionare anche eventi cominciati ieri e che terminano oggi la query non li seleionerebbe :S
 
Spremendo un po' le meningi ho fatto questa query:

Codice:
SELECT * FROM calendar WHERE ((inizio <= '$start' AND fine <= '$end') OR ('$start' <= fine <= '$end') OR ('$start' <= inizio <= '$end'))

dove $start e oggi alle 00:00:01 e $end è oggi alle 23:59:59
.... seleziona sia eventi che iniziano e si concludono oggi, sia quelli che cominciano oggi, sia quelli che finiscono oggi!
Tuttavia rimane il problema: se un evento comincia il 02 e finisce il 04... dal calendario sarà possibile vederlo il 2 ed il 4 ma non il 3...!
 
Spremendo un po' le meningi ho fatto questa query:

Codice:
SELECT * FROM calendar WHERE ((inizio <= '$start' AND fine <= '$end') OR ('$start' <= fine <= '$end') OR ('$start' <= inizio <= '$end'))

dove $start e oggi alle 00:00:01 e $end è oggi alle 23:59:59
.... seleziona sia eventi che iniziano e si concludono oggi, sia quelli che cominciano oggi, sia quelli che finiscono oggi!
Tuttavia rimane il problema: se un evento comincia il 02 e finisce il 04... dal calendario sarà possibile vederlo il 2 ed il 4 ma non il 3...!

No ok, forse mi sto rincoglionendo io ma questa query mi fa vedere l'evento in tutti i giorni del calendario indipendentemente da quando inizia e finisce :incazz2:
 
Ok allora, mi puoi indicare un valore tipo archiviato in inizio e fine ?
Inoltre mi puoi dire se i campi sono definiti come timestamp, int, o varchar ?
 
Ok allora, mi puoi indicare un valore tipo archiviato in inizio e fine ?
Inoltre mi puoi dire se i campi sono definiti come timestamp, int, o varchar ?

Si allora i campi sono INT con lunghezza di 20 anche se non penso sia importante! Ho solo un record nel database che ha come timestamp di inizio 1388690296 che sarebbe ieri alle 07:18 e come fine 1388743808 cioè oggi alle 10:10 :D
 
Int arriva a 10 come range massimo.

In ogni caso ho creato una tabella d'esempio:
Codice:
CREATE TABLE `events` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`inizio` INT(10) UNSIGNED NOT NULL,
	`fine` INT(10) UNSIGNED NOT NULL,
	PRIMARY KEY (`id`)
);

-- Dump dei dati
INSERT INTO `events` (`id`, `inizio`, `fine`) VALUES
	(1, 1388690296, 1388743808),
	(2, 0, 0),
	(3, 1388690296, 1388823808);


Ed ho eseguito questa query:
Codice:
SELECT * FROM events WHERE (DATE(NOW()) BETWEEN DATE(FROM_UNIXTIME(start)) AND DATE(FROM_UNIXTIME(end)))

Mi vengono pescati giustamente il primo e il terzo record.
Se provo a dargli DATE_ADD(NOW(), INTERVAL 1 DAY) (ovvero, la data di domani) al posto di NOW() mi ritorna solo il terzo record, come previsto.

In sostanza dalle mie prove risulta tutto corretto.
 
Int arriva a 10 come range massimo.

In ogni caso ho creato una tabella d'esempio:
Codice:
CREATE TABLE `events` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`inizio` INT(10) UNSIGNED NOT NULL,
	`fine` INT(10) UNSIGNED NOT NULL,
	PRIMARY KEY (`id`)
);

-- Dump dei dati
INSERT INTO `events` (`id`, `inizio`, `fine`) VALUES
	(1, 1388690296, 1388743808),
	(2, 0, 0),
	(3, 1388690296, 1388823808);


Ed ho eseguito questa query:
Codice:
SELECT * FROM events WHERE (DATE(NOW()) BETWEEN DATE(FROM_UNIXTIME(start)) AND DATE(FROM_UNIXTIME(end)))

Mi vengono pescati giustamente il primo e il terzo record.
Se provo a dargli DATE_ADD(NOW(), INTERVAL 1 DAY) (ovvero, la data di domani) al posto di NOW() mi ritorna solo il terzo record, come previsto.

In sostanza dalle mie prove risulta tutto corretto.

Si scusa in realtà non avevo considerato che il date(now()) mi restituisce sempre le query del giorno di oggi indipendentemente dal giorno passato per il $_GET
solo che se uso
$now = $year.'-'.$month.'-'.$day.' 00:00:01';
e modifico la query in
Codice:
SELECT * FROM events WHERE ($now BETWEEN DATE(FROM_UNIXTIME(start)) AND DATE(FROM_UNIXTIME(end)))
i risulatati compaiono comunque in tutti i giorni del calendario! Sbaglio forse il formato della variabile $now?

Perche comunque essendo un calendario gli utenti devono avere la possibilità di selezionare il giorno

Grazie per la paziena :S

P.S. scusa ho sbagliato ... se sostituisco date(now()) con $now la query non da addirittura nessun risultato
 
Ultima modifica:
C'è un errore anche da parte mia, ho scritto "start" e "end" nella query: dovrebbero essere "inizio" e "fine".
Per adoperare una data dinamicamente come ti serve dovresti definire la tua variabile da php senza ore minuti e secondi, in questo modo:
PHP:
$now = $year .'-'. $month .'-'. $day;

Ed inserirla nella query contornata da apici:
Codice:
SELECT * FROM events WHERE ('$now' BETWEEN DATE(FROM_UNIXTIME(inizio)) AND DATE(FROM_UNIXTIME(fine)))
 
ciao
per avere il giorno successivo basta che tu modifichi la riga
PHP:
$fin=mktime(23,59,59,$mm,$gg,$aa)+(24*60*60);// mezzanotte del  $gg+1/$mm/$aa
in
PHP:
$fin=mktime(23,59,59,$mm,$gg,$aa)+2*(24*60*60);// mezzanotte del  $gg+2/$mm/$aa

oppure forse dovresti aggiungere dei valori alla querystringa
es.
page.php?day=03&month=01&year=2014&quando=1&intervallo=2
mettendo quando=1 parti il gg prima del 3 1 2014
mettendo intervallo=2 la scadenza è due gg dopo vedendo quelli che scadono il 05 1 2014
PHP:
<?php
//.......
$gg=(int)$_GET['day'];
$mm=(int)$_GET['month'];
$gg=(int)$_GET['year'];
//trasformi in secondi
//non metto tutti gli opportuni controlli sui get e sui risultati, es che non sia $ini > $fin
$da_quando=(int)$_GET['quando'];
$sino_a=(int)$_GET['intervallo'];
$da=-$da_quando*(24*60*60);
$sino=$sino_a*(24*60*60);
//trasformi in timestamp
$ini=mktime(0,0,0,$mm,$gg,$aa)+$da;//ore 0:0:0 del $gg/$mm/$aa
$fin=mktime(23,59,59,$mm,$gg,$aa)+$sino;// mezzanotte del  $gg+1/$mm/$aa
$query="SELECT * FROM events WHERE inizio >=$ini AND fine <= $fin";
//.....
?>
comunque un consiglio: sarebbe meglio che tu usassi il metodo POST partendo da un form di immissione dati
 
Si, ho risolto!
Grazie mille non so quale query strana avrei realizzato io senza il tuo aiuto! :fonzie::fonzie:

Grazie mille ancora :D
 

Discussioni simili