2011-12-10 11 views
11

He guardado las fechas del registro de un usuario como fecha y hora, por ejemplo, 2011-12-06 10:45:36. He ejecutar esta consulta y me esperaba este artículo - 2011-12-06 10:45:36 - se seleccionará:MySQL - seleccionar datos de la base de datos entre dos fechas

SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND 
created_at <= '2011-12-06' 

Pero no lo es. ¿Existe alguna manera elegante, cómo seleccionar este artículo? Como primera idea que obtuve fue como 2011-12-06 + 1, pero esto no se ve muy bien.

Respuesta

25

Su problema es que la versión corta de la medianoche fechas utiliza como valor predeterminado. Por lo tanto, su consulta es en realidad:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
AND created_at <= '2011-12-06 00:00:00' 

Es por eso que no está viendo el registro para 10:45.

Cambiar a:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01' 
AND created_at <= '2011-12-07' 

También puede utilizar:

SELECT users.* from users 
WHERE created_at >= '2011-12-01' 
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY) 

que seleccionará a todos los usuarios en el mismo intervalo que busca.

que puede que encuentre el operador Entre más legible:

SELECT users.* from users 
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY)); 
0

Quizás usar entre mejor. Me funcionó para obtener el rango y luego filtrarlo

1

¿Has probado antes y después en lugar de> = y < =? Además, ¿es esta una fecha o una marca de tiempo?

+0

sí, la columna en la tabla es la marca de tiempo – user984621

+0

mi mal, antes y después son de otra cosa. para una marca de tiempo, necesita agregar un tiempo y una fecha como otros han respondido. – vextorspace

1

Buscando created_at <= '2011-12-06' buscará cualquier registro que haya sido creado antes de la medianoche del 2011-12-06 . Desea buscar created_at < '2011-12-07'.

+0

entiendo, gracias! – user984621

3

Debe utilizar '2011-12-07' como el punto final como una fecha sin una hora predeterminada para marcar el tiempo 00:00:00.

Así que lo que en realidad ha escrito se interpreta como:

SELECT users.* 
FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
    AND created_at <= '2011-12-06 00:00:00' 

Y su sello de tiempo es: 2011-12-06 10:45:36 que no está entre esos puntos.
cambiar esto también:

SELECT users.* 
FROM users 
WHERE created_at >= '2011-12-01' -- Implied 00:00:00 
    AND created_at < '2011-12-07' -- Implied 00:00:00 and smaller than 
            --     thus any time on 06 
+0

+1 Creo que publicamos la misma respuesta exactamente al mismo tiempo :-) – dash

+0

@dash En realidad, Loki lo publicó medio minuto antes y se suponía que debía ser la respuesta aceptada, pero tuvo más suerte. +1 para él para la respuesta más rápida, y +1 para ti por darle +1. –

5
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07'; 
1

Otra alternativa es utilizar DATE() función del operando de la izquierda como se muestra a continuación

SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06' 

 

0

Puede usar MySQL DATE fu nción, como a continuación

Por ejemplo, si desea que los resultados entre 09/05/2017 hasta 2017-09-09

SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09' 

Asegúrese de envolver las fechas dentro sola cita ''

Espero que esto ayude .

Cuestiones relacionadas