MySQL compara string DATE com string do campo DATETIME

Eu tenho uma pergunta: É possível selecionar de um database MySQL, comparando uma seqüência de DATE “2010-04-29” contra seqüências de caracteres que são armazenadas como DATETIME (2010-04-29 10:00)?

Eu tenho um selecionador de data que filtra dados e gostaria de consultar a tabela pelo campo DATETIME assim:

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'" 

… e gostaria de obter a linha que possui o valor DATETIME de “2010-04-29 10:00”.

Alguma sugestão? Obrigado.

Use o seguinte:

 SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29' 

Apenas para referência eu tenho uma tabela de registro de 2 milhões, eu corri uma consulta semelhante. Salils resposta demorou 4,48 segundos, o acima demorou 2,25 segundos.

Então, se a tabela é grande, eu sugiro que sim.

Se você quiser selecionar todas as linhas em que a parte DATE de uma coluna DATETIME corresponda a um determinado literal, não será possível fazer isso da seguinte maneira:

 WHERE startTime = '2010-04-29' 

porque o MySQL não pode comparar um DATE e um DATETIME diretamente. O que o MySQL faz, ele estende o literal DATE dado com o tempo ’00: 00: 00 ‘. Então sua condição se torna

 WHERE startTime = '2010-04-29 00:00:00' 

Certamente não é o que você quer!

A condição é um intervalo e, portanto, deve ser dada como intervalo. Existem várias possibilidades:

 WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59' WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY) 

Há uma pequena possibilidade de o primeiro estar errado - quando a coluna DATETIME usa resolução de subsegundos e há um compromisso às 23:59:59 + epsilon. Em geral, sugiro usar a segunda variante.

Ambas as variantes podem usar um índice em startTime que se tornará importante quando a tabela aumentar.

 SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'" 

OU

 SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29' 
 SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'; 

Isso ajuda, você pode converter os valores como DATE antes de comparar.

 SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s') 

isso para o formato datetime no mysql usando DATE_FORMAT(date,format) .

 SELECT * FROM `calendar` WHERE startTime like '2010-04-29%' 

Você também pode usar operadores de comparação em datas do MySQL se quiser encontrar algo depois ou antes. Isso ocorre porque eles são escritos de tal forma (maior valor para menor com zeros à esquerda) que uma simples ordenação de seqüência de caracteres os classificará corretamente.