¿Cómo consulto entre dos fechas usando MySQL?


225

La siguiente consulta:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

no devuelve nada

Sin embargo, debería tener datos más que suficientes para que la consulta funcione. ¿Qué estoy haciendo mal?


32
Tenga cuidado con ENTRE, ya que ambos miny los maxvalores se consideran dentro del rango, para no procesar dos veces una fecha que sea el valor miny max(caso límite). Por ejemplo, la fecha 2010-09-29 00:00:00será entre 2010-09-28 00:00:00y2010-09-29 00:00:00 , Y TAMBIÉN entre 2010-09-29 00:00:00y2010-09-30 00:00:00
minipif

sí, lo que dijo ^^
Albert Rannetsperger el

Respuestas:


472

Su segunda fecha es anterior a su primera fecha (es decir, está realizando consultas entre el 29 de septiembre de 2010 y el 30 de enero de 2010). Intente invertir el orden de las fechas:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

Lo sabía, pero ahora tengo problemas con la ACTUALIZACIÓN. Estoy tratando de usar ENTRE para ACTUALIZAR ¿debería funcionar de la misma manera?
Ingus

3
@IngusGraholskis: una wherecláusula debería funcionar igual en selecto updatedeclaraciones.
T30

Personalmente, encuentro el término 'de' y 'a' una forma disimulada de recordar el orden en que se debe escribir la consulta.
KeaganFouche

¿Cómo devolver todos los datos si ambas fechas son nulas o vacías?
Codificación del mundo

23

Su consulta debe tener fecha como

select * from table between `lowerdate` and `upperdate`

tratar

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

Es date_fieldde tipo datetime? También debe poner primero la fecha del auricular.

Debería ser:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE () es una función MySQL que extrae solo la parte de fecha de una expresión de fecha o fecha / hora

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

se podría añadir una explicación que la gente entienda lo que está haciendo.
Franz Gleichmann

7

Como extensión de la respuesta de @sabin y una pista si solo se quiere comparar la parte de la fecha (sin la hora):

Si el campo para comparar es del tipo fecha y hora y solo se especifican fechas para la comparación, entonces estas fechas se convierten internamente en valores de fecha y hora . Esto significa que la siguiente consulta

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

se convertirá a

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

internamente.

¡Esto a su vez conduce a un resultado que no incluye los objetos del 29/09/2010 con un valor de tiempo mayor que 00:00:00!

Por lo tanto, si todos los objetos con fecha 29/09/2010 también deberían incluirse, el campo para comparar debe convertirse en una fecha:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

4

Puede hacerlo manualmente, comparando con mayor que o igual y menor que o igual.

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

En nuestro ejemplo, necesitamos recuperar datos de un día en particular. Compararemos desde el comienzo del día hasta el último segundo de otro día.

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

1

Podría ser un problema con la configuración de la fecha en el lado del servidor o en el lado del cliente. He encontrado que este es un problema común en múltiples bases de datos cuando el host está configurado en español, francés o lo que sea ... eso podría afectar el formato dd / mm / aaaa o mm / dd / aaaa.


3
El problema era que la fecha anterior figuraba antes de la fecha nueva.
theninjagreg

1

Just Cast date_field as date

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

Cuando utilice valores de fecha y hora, debe convertir los campos como DateTimey no Date. Tratar :

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))

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.