Como comparar as datas do timestamp com o parâmetro apenas de data no MySQL?

numa declaração SQL, como comparo uma data gravada como data-limite com uma data no formato AAAA-MM-DD?

ex.: SELECT * FROM table WHERE timestamp = '2012-05-05'

quero que esta pesquisa devolva todas as linhas com a data-limite no dia indicado, mas só devolve as linhas com a hora-limite da meia-noite.

Obrigado.
Author: Rishabh, 2012-05-07

8 answers

Pode usar a função DATE() para extrair a parte da data do intervalo de tempo:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'

No entanto, se você tem um índice na coluna do timestamp, isso seria mais rápido porque ele poderia utilizar o índice:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
 96
Author: Marcus Adams, 2012-05-07 13:42:49
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'
 4
Author: Cfreak, 2012-05-07 13:43:26
 WHERE cast(timestamp as date) = '2012-05-05'
 3
Author: juergen d, 2012-05-07 13:43:24

Utilize uma função de conversão de MYSQL:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

Isto deve funcionar

 1
Author: adrien, 2012-05-07 13:43:21
Use  

SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05' 
 1
Author: Muhammad Fahad, 2016-05-09 11:14:26

No caso de estar a usar parâmetros SQL para executar a consulta, então isto seria útil

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
 0
Author: devesh, 2014-02-20 16:24:56
Quando li a tua pergunta, pensei que estavas no Oracle DB até ver a etiqueta "MySQL". De qualquer forma, para as pessoas que trabalham com a Oracle aqui é o caminho:
SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
 0
Author: KeyMaker00, 2017-08-23 07:36:19

Como sugerido por alguns, ao usar DATE(timestamp) está a aplicar manipulação à coluna e, por isso, não pode confiar na ordenação do Índice.

No entanto, a utilização de BETWEEN só seria fiável se incluísse os milisegundos. No exemplo timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59', você exclui os registos com um timestamp entre 2012-05-05 23:59:59.001 e 2012-05-05 23:59:59.999. No entanto, mesmo este método tem alguns problemas, por causa da precisão datatypes. Ocasionalmente, 999 milisegundos são arredondados.

A melhor coisa a fazer riz:
SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'
 0
Author: Tom Kitson, 2018-09-13 10:41:29