En una declaración SQL, ¿cómo comparo una fecha guardada como TIMESTAMP con una fecha en formato AAAA-MM-DD?
Ex.: SELECT * FROM table WHERE timestamp = '2012-05-05'
Quiero que esta consulta devuelva todas las filas con marca de tiempo en el día especificado, pero solo devuelve filas con marca de tiempo de medianoche.
Gracias
fuente
Como sugieren algunos, al usar
DATE(timestamp)
está aplicando manipulación a la columna y, por lo tanto, no puede confiar en el orden del índice.Sin embargo, el uso
BETWEEN
solo sería confiable si incluye los milisegundos. En el ejemplo de marca de tiempoBETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
, excluye los registros con una marca de tiempo entre2012-05-05 23:59:59.001
y2012-05-05 23:59:59.999
. Sin embargo, incluso este método tiene algunos problemas debido a la precisión de los tipos de datos. Ocasionalmente, se redondea 999 milisegundos.Lo mejor que puedes hacer es:
SELECT * FROM table WHERE date>='2012-05-05' AND date<'2012-05-06'
fuente
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' AND timestamp <= '2012-05-05 23:59:59'
fuente
Utilice una función de conversión de MYSQL:
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
Esto debería funcionar
fuente
Mientras investigaba esto, pensé que sería bueno modificar la solución BETWEEN para mostrar un ejemplo para una fecha de cadena / no estática en particular, pero más bien una fecha variable, o la de hoy como
CURRENT_DATE()
. Esto usará el índice en la columna log_timestamp.SELECT * FROM some_table WHERE log_timestamp BETWEEN timestamp(CURRENT_DATE()) AND # Adds 23.9999999 HRS of seconds to the current date timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));
Hice los segundos / microsegundos para evitar el caso de las 12 AM del día siguiente. Sin embargo, también puede hacer `INTERVALO '1 DÍA' a través de operadores de comparación para un enfoque no BETWEEN más fácil de leer:
SELECT * FROM some_table WHERE log_timestamp >= timestamp(CURRENT_DATE()) AND log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));
Ambos enfoques utilizarán el índice y deberían funcionar MUCHO más rápido. Ambos parecen ser igualmente rápidos.
fuente
En caso de que esté utilizando parámetros SQL para ejecutar la consulta, esto sería útil
SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
fuente
Cuando leí su pregunta, pensé que estaba en Oracle DB hasta que vi la etiqueta 'MySQL'. De todos modos, para las personas que trabajan con Oracle, este es el camino:
SELECT * FROM table where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
fuente
Utilizar
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
fuente