PDA

View Full Version : [MySql] Query su intervallo di date


digital_brain
10-03-2015, 18:43
Ciao a tutti,
ho un problema con una query che mi sta facendo dannare...:muro: :muro: :muro:
devo tirare fuori da una tabella dei valori che corrispondono ad un intervallo di giorni (da inizio mese a ieri).
le ho provate tutte ma l'interrogazione mi include anche alcuni giorni del mese precedente pur avendogli dato come intervallo ben definito dal 1/03/2015 al 31/03/2015.
la query è la seguente:
SELECT `COL 6` FROM `realtime_es3` WHERE `COL 4` = 'Attiva' AND `COL 6` < DATE_FORMAT (now(),'%e/%m/%Y') and `COL 6` between '01/03/2015' and '31/03/2015'


quello che mi restituisce la query sono giustamente i giorni dal 1 al 9/03 ma anche i giorni 8-9 e 10/2....come è possibile????

se semplifico la query così
SELECT `COL 6` FROM `realtime_es3` WHERE `COL 4` = 'Attiva' AND `COL 6` between '01/03/2015' and '31/03/2015'
addirittura mi stampa tutti i giorni presenti nella tabella ignorando completamente il between.

Pensavo che il problema potesse essere il fatto che il tipo della colonna data è varchar, ma anche facendo un cast a DATE mi restituisce null.

Grazie in anticipo!

Gimli[2BV!2B]
10-03-2015, 22:00
Il tipo di dato di `COL 6` è VARCHAR? E contiene solo date formattate "alla europea", giusto?

Perché questa scelta molto poco felice? Perché un nome scomodo che non identifica il contenuto? Per finire, perché 'Attiva' in `COL 4` non è un INT o TINYINT?

Lavorando molto poco efficientemente sui dati grezzi penserei a una cosa del genere:SELECT `COL 6`
FROM `realtime_es3`
WHERE `COL 4` = 'Attiva'
AND STR_TO_DATE(`COL 6`,'%d/%m/%Y') < NOW()
AND STR_TO_DATE(`COL 6`,'%d/%m/%Y') BETWEEN '2015-03-01' AND '2015-03-31'

Se si desidera escludere anche la giornata odierna con < NOW(), la soluzione che m'è venuta in mente è questa:SELECT `COL 6`
FROM `realtime_es3`
WHERE `COL 4` = 'Attiva'
AND ADDTIME( STR_TO_DATE(`COL 6`,'%d/%m/%Y'), '23:59:59.999') < NOW()
AND STR_TO_DATE(`COL 6`,'%d/%m/%Y') BETWEEN '2015-03-01' AND '2015-03-31'

digital_brain
10-03-2015, 22:40
Che dirti....sei un grande!!!Grazie!!!ho fatto solo una prova veloce ma pare che funziona...il mio errore era nel dare a between gli intervalli con le date in formato europeo anzichè americano?

Gimli[2BV!2B]
11-03-2015, 21:38
Varie incomprensioni sovrapposte:

le colonne contengono stringhe con una formattazione che MySQL non si aspetta
è necessario spiegargli come convertirle in un tipo di dato confrontabile con le condizioni che si desidera applicare (DATETIME, in questo caso però privo di time), quindi ho scelto STR_TO_DATE
avendo scritto le condizioni con la stessa formattazione inattesa MySQL s'è inventato qualcosa per interpretarle, ma non c'ha azzeccato

Il formato che si aspetta normalmente MySQL nelle condizioni è ISO 8601 (http://en.wikipedia.org/wiki/ISO_8601), di solito uno di questi:

aaaa-mm-gg
aaaa-mm-gg hh:mm:ss
aaaa-mm-gg hh:mm:ss.mmm

digital_brain
12-03-2015, 17:25
Grazie mille!;)