¿Cómo comparar las fechas de la marca de tiempo con el parámetro de solo fecha en MySQL?


88

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

Respuestas:


144

Puede usar la DATE()función para extraer la parte de la fecha de la marca de tiempo:

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

Sin embargo, si tiene un índice en la columna de marca de tiempo, esto sería más rápido porque podría utilizar un índice en la columna de marca de tiempo si tiene uno:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'

5
A través de una pequeña prueba que acabo de ejecutar, descubrí que usar BETWEEN es más rápido en un factor de 10 veces Solo para su información
DarbyM


6

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 BETWEENsolo sería confiable si incluye los milisegundos. En el ejemplo de marca de tiempo BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59', excluye los registros con una marca de tiempo entre 2012-05-05 23:59:59.001y 2012-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'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

Utilice una función de conversión de MYSQL:

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

Esto debería funcionar


1

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.


0

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')

0

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');

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.