mysql - rango - ¿Cómo seleccionar la fecha de la columna de fecha y hora?
time mysql ejemplo (7)
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 cláusula WHERE
(incluido el cálculo de DATE()
) ya que ese cálculo debe realizarse en todas las filas de la tabla.
La construcción BETWEEN ... AND
es inclusiva para ambas condiciones de borde, requiriendo especificar la sintaxis 23:59:59 en la fecha de finalización que tiene otros problemas (transacciones de microsegundos, que creo que MySQL no admitió en 2009 cuando la pregunta le preguntaron).
La forma correcta de consultar un campo de timestamp
MySQL para un día en particular es verificar el valor de Mayor que Igual contra la fecha deseada, y Menor que el día posterior, sin especificar la hora.
WHERE datetime>=''2009-10-20'' AND datetime<''2009-10-21''
Este es el método de más rápido rendimiento, memoria más baja, que requiere menos recursos, y además admite todas las características de MySQL y casos de esquina, como la precisión de marca de tiempo de segundos. Además, es una prueba de futuro.
Tengo una columna de tipo "datetime" con valores como 2009-10-20 10:00:00
Me gustaría extraer la fecha de fecha y hora 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?
Bueno, usar like in statement es la mejor opción donde datetime como ''2009-10-20%'', debería funcionar en este caso
Puede formatear la fecha y hora en la parte YMD:
DATE_FORMAT(datetime, ''%Y-%m-%d'')
Puedes usar:
DATEDIFF ( day , startdate , enddate ) = 0
O:
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
O:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
Usar WHERE DATE(datetime) = ''2009-10-20''
tiene problemas de rendimiento . Como se indica here :
- calculará
DATE()
para todas las filas, incluidas aquellas que no coinciden - hará que sea imposible usar un índice para la consulta
Use BETWEEN
o >
, <
, =
operadores que permiten usar un índice:
SELECT * FROM data
WHERE datetime BETWEEN ''2009-10-20 00:00:00'' AND ''2009-10-20 23:59:59''
Actualización: el impacto en el uso de LIKE
lugar de operadores en una columna indexada es alto . Estos son algunos resultados de prueba en una tabla con 1,176,000 filas:
- usando
datetime LIKE ''2009-10-20%''
=> 2931ms - usando
datetime >= ''2009-10-20 00:00:00'' AND datetime <= ''2009-10-20 23:59:59''
=> 168ms
Al hacer una segunda llamada sobre la misma consulta, la diferencia es aún mayor: 2984ms vs 7ms (sí, ¡solo 7 milisegundos!). Encontré esto mientras reescribía un código viejo en un proyecto usando Hibernate.
forma simple y mejor para usar la función de fecha
ejemplo
SELECT * FROM
data
WHERE date(datetime) = ''2009-10-20''
O
SELECT * FROM
data
WHERE date(datetime ) >= ''2009-10-20'' && date(datetime ) <= ''2009-10-20''
WHERE DATE(datetime) = ''2009-10-20''
o prueba esto también y mira si funciona o no. Esto ayuda
WHERE datetime LIKE ''2009-10-20%''
Debes verificar si funciona o no.