MySql - Select in base alla data

criccroc

Utente Attivo
7 Gen 2011
44
0
6
Ciao a tutti.
Il problema di questa volta riguarda una SQL che non so generare malgrado ho provato in diversi modi e letto di tutto in diversi forum.

Ho un database MySql con un campo "data_causale" e questo e' un esempio di record:

2010-11-30
2010-12-01
2011-01-18
2011-01-25
2011-01-29 ... e cosi via (come vedete formato AAAA-MM-GG).

Devo poter scegliere una serie di record in base a una scelta fatta in un modulo html.
Le scelte sono:
1) Mese corrente 2) Mese precedente 3) Seleziona Periodo (da ... a ...).

La prima SELECT non e' stata per me difficile:
$sql = "SELECT * FROM causali WHERE MONTH (data_causale) = MONTH(curdate()) ORDER BY id_causale ASC";

che in questo caso mi mostra soltanto i seguenti record:
2011-01-18
2011-01-25
2011-01-29 FUNZIONA

Il problema nasce invece nelle 2 altre select che non sono riuscito a comporre:

MESE PRECEDENTE:
$sql = "SELECT * FROM causali WHERE MONTH(data_causale) = MONTH(curdate)-1 ORDER BY id_causale ASC"; NON FUNZIONA!

SELEZIONE PERIODO:
$sql = "SELECT * FROM causali WHERE data_causale BETWEEN '01/11/2010' AND '14/01/2011'" NON FUNZIONA!

(ho provato anche ad invertire la data nel formato 2010/01/11 con / o con - il risultato e' sempre negativo).

Qualcuno mi può dare una mano per favore? :)
Grazie in anticipo.
Carlo.
 
Prova a riscrivere la query del mese precedente così:
Codice:
SELECT * FROM causali WHERE MONTH(data_causale) = (MONTH(CURDATE()) - 1) ORDER BY id_causale ASC
E quella per il periodo così:
Codice:
SELECT * FROM causali WHERE data_causale BETWEEN '2010-11-01' AND '2011-01-14'
Ho fatto dei test e sembra funzionare egregiamente.
 
Caro Alessandro, grazie come al solito per il tuo aiuto.

Infatti grazie a te sono riuscito ad evadere anche la TERZA CONDIZIONE con la seguente stringa:

$sql = "SELECT * FROM causali WHERE data_causale BETWEEN '2010-12-01' AND '2011-01-14'";

Per quanto riguarda la SECONDA CONDIZIONE (il mese precedente), il problema e' che essendo a GENNAIO (1) usare l'opzione -1 ti da come risultato 0.

Bisognerebbe quindi secondo me utilizzare un altro metodo. Ti viene in mente qualche cosa? GRAZIE COME SEMPRE.
Ciaoo.
 
ciao
devi intevenire prima e strutturare la select anche in base all'anno con un if
ti scrivo in pseudo codice, poi in php ti arrangi tu
se MONTTH(CURDATE()-1) ==0 {
mese =12
anno = YEAR((CURDATE()-1)
}
analogo se tu dovessi fare mese successivo
se MONTTH(CURDATE()11) ==13 {
mese =01
anno = YEAR((CURDATE()+1)
}


SELECT * FROM causali WHERE MONTH(data_causale) = mese AND YEAR(data_causale)= anno ORDER BY id_causale ASC
 
ciao
io farei una piccola aggiunta (dato che lavorare con le date è sempre una rogna)
intanto perche sarebbe giusto (e anche più comodo) che i mesi fossero rappresentati da 01, 02, 03.... e non da 1, 2...


PHP:
<?php 
$month = date('m'); 
$year = date('Y'); 

if(($month -1)=== 0) //preferirei così
{ 
    $month = 12; 
    $year -= 1; 
} 
else 
{
    $month -= 1;//qui $month diventa un intero e quindi se era 01 diventa 1
	if(strlen($month)<2){$month="0".$month;}
}
?>
questo perchè se non si mettono i mesi di due cifre e poi faccio un confronto delle stringhe
2011-12-31 è minore di 2011-2-28 (??)
mentre
2011-12-31 è non minore di 2011-02-28
ma forse sbaglio

p.s.
ma quanto meglio sarebbe lavorare con le date in formato timestamp per poi trasformale a tipo umano solo a monitor
 
io cosi ho risolto:

IF (date("m") == "01") {
$mese = 12 ;
$anno = date("Y")-1;
$sql = "SELECT * FROM causali WHERE (MONTH(data_causale) = $mese) AND (YEAR(data_causale)= $anno) ORDER BY id_causale ASC";
} else {
$sql = "SELECT * FROM causali WHERE MONTH(data_causale) = (MONTH(CURDATE()) - 1) ORDER BY id_causale ASC";
}
 
ciao
sembrerebbe ok
l'unico dubbio, perchè non l'ho mai usato, è sul formato restituito da

(MONTH(CURDATE()) - 1)

perche se ti restituisce, come detto prima essendo una differenza, un intero
es. 10-1 ti da 9 e se nella tabella il valore di settembre è 09 l'uguaglianza non sussiste
 

Discussioni simili