2013-07-15 18 views
5

ProblemaSelezionare i record in cui datetime è maggiore rispetto alla data specificata

Sto cercando di recuperare tutti i record dalla tabella in cui date_time campo è maggiore 'Gio, 11 Luglio 2013' eseguendo il sotto la query citata. Il valore nel campo date_time è memorizzato in questo formato => Gio 11 Lug 2013 08:29:37. Ogni aiuto sarà gradito.

Tipo di dati di campo date_time è varchar

Query

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= 'Thu, 11 Jul 2013 00:00:00'; 
+0

Controllare il tipo di dati DATE_TIME. È varchar o data? Il tipo di dati –

+0

è varchar – colourtheweb

+2

È necessario convertire la stringa in una data, non la data in una stringa. – Barranka

risposta

5

Si sta tentando di confrontare una data con una stringa.

L'applicazione di funzione str_to_date è corretta, ma non si sta confrontando con una data.

Il modo giusto per farlo è:

select * from yourTable 
where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= '2013-07-11 00:00:00' 

Si noti che il formato della data è AAAA-MM-GG HH: mm: ss (che è formato data di default di MySQL).

Naturalmente, è anche possibile confrontare a str_to_date risultati:

... where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s') 
+0

Penso che tu abbia un extra 'where' nella seconda query? Se no, per favore spiega la sintassi. –

+0

@ebyrob Grazie ... solo un refuso – Barranka

6

Qui è ancora un altro grande esempio del perché è necessario implementare campi data/ora in MySQL utilizzando la data, datetime, o tipi di campi data/ora e lascia che l'applicazione si occupi di come formattare la data per l'output.

In questo momento si sta per bisogno di fare qualcosa di simile:

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s'); 

Questa query non sarà in grado di utilizzare qualsiasi indice che avete sul vostro date_time campo, quindi la query sarà molto inefficiente. Sarà necessario eseguire una scansione completa della tabella, convertendo il valore di ogni riga per effettuare il confronto.

Che cosa si dovrebbe fare è:

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND date_time >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s'); 

Qui se avete il vostro campo nel formato datetime MySQL, avete solo bisogno di convertire l'ingresso a un questo formato per la corrispondenza. Dal momento che i tuoi dati di campo sono già in questo formato, sarai in grado di utilizzare un indice per la ricerca.

Problemi correlati