2012-12-31 11 views
80

Ho una tabella che contiene una colonna datetime. Desidero restituire tutti i record di un determinato giorno indipendentemente dal tempo. O in altre parole, se il mio tavolo contenesse solo i seguenti 4 record, solo il 2 ° e il 3 ° sarebbero restituiti se limitassi al 2012-12-25.MySQL SELECT WHERE datetime corrisponde al giorno (e non necessariamente al tempo)

2012-12-24 00:00:00 
2012-12-25 00:00:00 
2012-12-25 06:00:00 
2012-12-26 05:00:00 
+0

See risposta da John Woo a http://stackoverflow.com/questions/14769026/mysql-select-where-timestamp-today – ekerner

risposta

217

MAI MAI utilizzare un selettore come DATE(datecolumns) = '2012-12-24' - è un killer di prestazioni:

  • calcolerà DATE() per tutte le righe, compresi quelli, che non corrispondono
  • che renderà impossibile di utilizzare un indice per la query

E 'molto più veloce da utilizzare

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59' 

poiché ciò consentirà l'uso dell'indice senza calcolo.

EDIT

Come sottolineato da Used_By_Already, nel tempo dal momento che la risposta iniziale che nel 2012, ci sono emersi versioni di MySQL, dove utilizzando '23: 59: 59' come la fine della giornata non è più sicuro. Una versione aggiornata dovrebbe leggere

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00' 
AND columname <'2012-12-26 00:00:00' 

Il nocciolo della risposta, vale a dire la prevenzione di un selettore su un'espressione calcolata, naturalmente si trova ancora.

+0

Stavo per dire che la soluzione di a1ex07 non sembra buona come le altre. Dopo aver letto il tuo post, forse ho bisogno di invertire il mio pensiero! – user1032531

+2

Appena testato su due server, quanto sopra è MOLTO (10x almeno) più veloce di date() = '' specialmente per tabelle enormi. Grazie – zzapper

+0

Non è sufficiente dire * e 2012-12-26 *? La data viene automaticamente considerata pari all'ora 0 (cioè 00: 00: 00.000) e il limite superiore è esclusivo. O sono semplicemente confuso? –

25

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26' potrebbero potenzialmente funzionare meglio (se si dispone di un indice su colonna_data) rispetto DATE.

+1

Io in realtà chiedo che cosa è più veloce - questa o la soluzione "BETWEEN" ... qualcuno è stato segnalato? –

+4

Non dovrebbe essere alcuna differenza. 'BETWEEN' è solo un modo per scrivere' field> = value1 e fied <= value2'. – a1ex07

+1

Si noti che per il manuale MySQL: "Per ottenere risultati ottimali quando si utilizza BETWEEN con valori di data o ora, utilizzare CAST() per convertire esplicitamente i valori nel tipo di dati desiderato. Esempi: Se si confronta un DATETIME con due valori DATE, convertire i valori DATE in valori DATETIME. Se si utilizza una costante di stringa come "2001-1-1" in un confronto con un DATE, eseguire il cast della stringa su DATE. " Quindi, a meno che non siano tutti dello stesso tipo, è meglio scriverli espressamente. – techdude

14

È possibile utilizzare %:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%' 
+8

LIKE sembra essere lento come DATE (datetimecol). Meglio usare la soluzione di Eugen o a1ex07. –

Problemi correlati