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.
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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.
 

criccroc

Utente Attivo
7 Gen 2011
44
0
6
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.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

criccroc

Utente Attivo
7 Gen 2011
44
0
6
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";
}
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
Autore Titolo Forum Risposte Data
W MySQL ciclo in SELECT MySQL 0
W MySQL SELECT list dinamica MySQL 0
D [MySQL] Tabelle "molti a molti", SELECT con troppe QUERY MySQL 7
webmachine [PHP][MYSQL] Problema con le SELECT PHP 5
T PHP+MYSQL: una select che cerchi un campo vuoto PHP 7
danjde [MySQL] Escludere specifico valore dalla query select MySQL 3
F [MySQL] Select con due condizioni su uno stesso campo MySQL 7
daniele8808 [MySQL] SQL SELECT restituisce più valori del dovuto MySQL 2
G [MySQL] Join o select MySQL 1
H select dinamiche php mysql PHP 4
I SELECT mysql su parametro data PHP 5
P [MYSQL] SELECT di ..CONFRONTO MySQL 0
F Select Option eTabella MySql PHP 3
F Problema selezione dinamica select/jsp/mysql Javascript 0
G [risolto] MySql, SELECT, GROUP BY e COUNT MySQL 6
K aiuto su gestione casella select del form + php + mysql PHP 0
andrea.peo PHP forzare option value di elenco select database Mysql PHP 2
H Problema con MySQL e PHP, dopo aver fatto una SELECT non ottengo alcun risultato PHP 7
R MySQL JOIN o UNION SELECT? (tabella vuota) MySQL 0
G Inserire un campo mysql in un select per form PHP 3
Z Select dinamiche PHP MySQL Javascript PHP 1
D Mysql - Select solo i campi che vengono compresi in una data MySQL 2
W [Php - MySql] ricerca con form select diversi PHP 14
M Query php select mysql PHP 12
C visualizzazione select MySql PHP 0
K Select tra più mysql PHP 1
K form Inserimento record mysql PHP 2
P Mysql lento a cancellare MySQL 1
P Codifica caratteri speciali mysql php PHP 0
N MAX() + ADD_DATE - per update su Mysql MySQL 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
L Mysql gestionale multipiattaforma MySQL 0
M utilizzo mysql in nodejs - crea createdAt e updateAt MySQL 1
T colonne di tabelle mysql ordinate MySQL 0
M Sintassi "personalizzata" per mysql workbench? MySQL 0
A Mysql MySQL 0
F Ricreare struttura php+mysql su Xampp Apache 0
M Array associativi php su 2 campi mysql PHP 10
Z Controllo giorni MYSQL PHP 0
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
L Mysql: Nascondere le pagine dopo una ricerca PHP 1
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
S problema con recupero dati tabella mysql PHP 2
E Progressbar estrazione dati da tabella mySQL Ajax 9
Z MySql injection PHP PHP 1
D controllare valore in tabella mysql PHP 0
A pulsante di update campo mysql con javascript Javascript 2

Discussioni simili