¿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?

NullVoxPopuli
fuente
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')
Daniel Vandersluis
fuente
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')
Nik
fuente
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')
Cohete Hazmat
fuente
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';
sabin
fuente
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')
ltlBeBoy
fuente
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';
Fahd Allebdi
fuente
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.

Portero de almas
fuente
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' )
DS Mercy
fuente
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))
Bruno Barral
fuente
0

Intenta cambiar las fechas:

2010-09-29 > 2010-01-30?
Jure1873
fuente