Tengo una columna de tipo "datetime" con valores como 2009-10-20 10:00:00
Me gustaría extraer la fecha de datetime y escribir una consulta como:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
¿Es la siguiente la mejor manera de hacerlo?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Sin embargo, esto devuelve un conjunto de resultados vacío. ¿Alguna sugerencia?
El uso
WHERE DATE(datetime) = '2009-10-20'
tiene problemas de rendimiento . Como se indica aquí :DATE()
para todas las filas, incluidas las que no coinciden.Utilizar
BETWEEN
o>
,<
,=
los operadores que permiten utilizar un índice:Actualización: el impacto en el uso en
LIKE
lugar de operadores en una columna indexada es alto . Estos son algunos resultados de pruebas en una tabla con 1,176,000 filas:datetime LIKE '2009-10-20%'
=> 2931 msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168msAl hacer una segunda llamada sobre la misma consulta, la diferencia es aún mayor: 2984 ms frente a 7 ms (¡sí, solo 7 milisegundos!). Encontré esto mientras reescribía un código antiguo en un proyecto usando Hibernate.
fuente
DATE(datetime)
deBETWEEN AND
MySql se convierte automáticamente en detrás de las escenas, obtenemos una breve declaración y un excelente rendimiento. Por qué no? ¿Por qué no hicieron esto? :)DATE(datetime) in (:list)
no funcionaBETWEEN
Puede formatear la fecha y hora en la porción YMD:
fuente
DATE_FORMAT(datetime, '%H:%i:%S')
Aunque todas las respuestas en la página devolverán el resultado deseado, todas tienen problemas de rendimiento. Nunca realice cálculos en los campos de la
WHERE
cláusula (incluido unDATE()
cálculo) ya que ese cálculo debe realizarse en todas las filas de la tabla.El
BETWEEN ... AND
constructo es inclusivo para ambas condiciones fronterizas, lo que requiere que se especifique la sintaxis 23:59:59 en la fecha de finalización, que en sí tiene otros problemas (transacciones de microsegundos, que creo que MySQL no admitió en 2009 cuando se hizo la pregunta).La forma correcta de consultar un
timestamp
campo MySQL para un día en particular es verificar si es mayor que igual a la fecha deseada y menor que el día posterior, sin hora especificada.Este es el método de más rápido rendimiento, menor memoria y menor uso de recursos, y además admite todas las características de MySQL y los casos de esquina, como la precisión de la marca de tiempo de menos de un segundo. Además, es una prueba de futuro.
fuente
Aquí están todos los formatos
Digamos que esta es la columna que contiene el
datetime
valor, tabladata
.fuente
Puedes usar:
O:
O:
fuente
manera simple y mejor de usar la función de fecha
ejemplo
O
fuente
Bueno, usar
LIKE
en la declaración es la mejor opciónWHERE datetime LIKE '2009-10-20%'
que debería funcionar en este casofuente