Seleccionar datos entre un rango de fecha / hora

83

¿Cómo selecciono datos entre un rango de fechas en MySQL? Mi datetimecolumna está en formato de hora zulú de 24 horas.

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

No devuelve nada a pesar de tener datos entre estos períodos de tiempo. ¿Tengo que forzar los valores en los campos 'desde' y 'hasta' para datetimeescribir la consulta?

codificación
fuente
¿Para qué es el tipo de datos game_date?
hjpotter92
1
su fecha y hora. Creo que descubrí por qué estaba confundido. Estoy usando el software toad para mysql y, de forma predeterminada, muestra las fechas en el formato que usé en mi rango de fechas, por lo que usé el mismo. Entonces, el problema fue el formato de la fecha que proporcioné en mi rango.
codingknob
Si utilizo el formato proporcionado por Eugen Rieck, funciona como se esperaba.
codingknob

Respuestas:

143

Necesita actualizar el formato de fecha:

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;
Eugen Rieck
fuente
2
¿Cuál es la fecha y cuál es el mes aquí?
Arun
8
El formato para un literal de fecha es 'AAAA-MM-DD HH: mm: SS'
Eugen Rieck
13
Usar BETWEEN NO es la mejor práctica, especialmente porque MySQL ahora admite precisión de tiempo inferior a un segundo . Usar 23:59:59 es un segundo completo antes del final de un día. where game_date >= '2012-03-11' and game_date < '2012-05-12'es la forma más precisa de definir un rango de fechas y funcionará para cualquier nivel de precisión de tiempo desde la fecha hasta las unidades inferiores a un segundo.
Used_By_Already
3
@Used_By_Already Cuando se respondió a esto en 2013, no había MySQL de menos de un segundo, y todavía no he oído hablar de un juego de hockey que comience entre las 23:59 y las 00:00 con una hora de inicio de menos de un segundo.
Eugen Rieck
5
Es para los lectores que usan versiones de MySQL con precisión inferior a un segundo que dejé este comentario. MySQL versión 5.6.4 o posterior admite fracciones de segundo. (Independientemente del deporte o propósito para el que sea el intervalo de fechas).
Used_By_Already
19

A continuación, se muestra una forma sencilla de utilizar la función de fecha:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc
Gordon Linoff
fuente
7
¿Soy ciego o esto es un asesino de rendimiento? date(game_date)hará que la comparación se ejecute con un valor calculado , no con un campo, lo que dará como resultado que no se use el índice y que se toquen todas las filas (es decir, escaneo completo de la tabla).
Eugen Rieck
1
@EugenRieck. . . Tiene razón en general, asumiendo que hay un índice en game_date. Incluso sin un índice, la tabla tendría que tener un tamaño moderado para una diferencia notable en el rendimiento. Algo en el nombre hockey_statsme sugiere que esta no es una mesa realmente grande.
Gordon Linoff
8

Una forma sencilla:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'
rashedcs
fuente
5

Probablemente necesite usar la función STR_TO_DATE :

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(si game_date es una cadena, es posible que debas usar STR_TO_DATE en ella)

fthiella
fuente
4

El formato de fecha de MySQL es este: YMD. Estás usando Y / M / D. Eso está mal. modificar su consulta.

Si inserta la fecha como Y / M / D, se insertará un valor nulo en la base de datos.

Si está usando PHP y la fecha que está obteniendo del formulario es como este Y / M / D, puede reemplazarlo usando la declaración.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))
Hafiz Shehbaz Ali
fuente
4

De forma sencilla se puede consultar como

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

Esto funciona si el tiempo no es una preocupación.

Teniendo en cuenta el tiempo también sigue de la siguiente manera:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

Tenga en cuenta que esto es para el servidor MySQL.

Mithun Theertha
fuente
2

Puede utilizar la función STR_TO_DATE y pasar sus propios parámetros de fecha según el formato que haya publicado:

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

O simplemente use el formato con el que MySQL maneja las fechas AAAA: MM: DD HH: mm: SS y tenga la consulta como

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;

stackFan
fuente
2

Debe buscar la fecha para defender cómo inserta los datos de la fecha del juego en su base de datos ... por ejemplo, si insertó el valor de la fecha en una fecha larga o corta.

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

También puede utilizar BETWEEN :

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

simple como eso.

ramber
fuente
Estoy intentando lo mismo, pero no funciona correctamente, obteniendo datos aleatorios por fecha.
Manjeet Kumar Nai