MySQL SELECT WHERE datetime corresponde ao dia (e não necessariamente ao tempo)

Eu tenho uma tabela que contém uma coluna datetime. Desejo retornar todos os registros de um determinado dia, independentemente do horário. Ou, em outras palavras, se minha tabela contivesse apenas os 4 registros a seguir, somente o segundo e o terceiro seriam retornados se eu limitar a 2012-12-25.

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

NUNCA use um seletor como DATE(datecolumns) = '2012-12-24' – é um matador de desempenho:

  • ele calculará DATE() para todas as linhas, incluindo as que não corresponderem
  • tornará impossível usar um índice para a consulta

É muito mais rápido usar

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

como isso permitirá o uso do índice sem cálculo.

EDITAR

Como apontado por Used_By_Already, no tempo desde a resposta inicial em 2012, surgiram versões do MySQL, onde usar ’23: 59: 59′ como final do dia não é mais seguro. Uma versão atualizada deve ler

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

A essência da resposta, ou seja, evitar um seletor em uma expressão calculada, é claro, ainda permanece.

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26' pode potencialmente funcionar melhor (se você tiver um índice em date_column) do que em DATE .

Você pode usar % :

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