Estoy tratando de seleccionar solo los registros de hoy de una tabla de base de datos.
Actualmente uso
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Pero esto toma los resultados de las últimas 24 horas, y lo necesito para seleccionar solo los resultados de hoy, ignorando el tiempo. ¿Cómo puedo seleccionar resultados basados solo en la fecha?
Using where; Using index
.timestamp
(ydate
como en mi caso) es una palabra reservada de MySQLSi desea que se use un índice y la consulta no haga un escaneo de tabla:
Para mostrar la diferencia que esto hace en los planes de ejecución reales, probaremos con un SQL-Fiddle (un sitio extremadamente útil):
Probemos ahora las 2 versiones.
Versión 1 con
DATE(timestamp) = ?
Explique:
Se filtra todos (6671) filas y luego hace una filesort (que no es un problema ya que las filas devueltas son pocos)
Versión 2 con
timestamp <= ? AND timestamp < ?
Explique:
Utiliza un escaneo de rango en el índice y luego lee solo las filas correspondientes de la tabla.
fuente
INDEX t_IX (timestamp, id)
podría (¿debería?) serINDEX t_IX (timestamp)
, ya que la clave principal está implícita en el índice. ¿O hay alguna razón que no entiendo para hacer eso? lo probé en sql-fiddle y vi el mismo plan de ejecución (mejor)id
(porque es el PK y por lo tanto el índice agrupado de la tabla) se agrega al índice de todos modos. Por lo tanto, no está de más agregarlo explícitamente (y puede detectar algunos puntos ciegos del optimizador). Ciertamente no es relevante en este caso / consulta.timestamp < CURDATE() + INTERVAL 1 DAY
es necesario?es más corto, no es necesario usar 'AND timestamp <CURDATE () + INTERVAL 1 DAY'
porque CURDATE () siempre devuelve el día actual
Función MySQL CURDATE ()
fuente
¿De cuántas formas podemos despellejar a este gato? Aquí hay otra variante más.
SELECCIONAR * DESDE
table
DONDE FECHA (FROM_UNIXTIME (timestamp
)) = '2015-11-18';fuente
Si desea comparar con una fecha en particular, puede escribirlo directamente como:
// aquí la marca de tiempo es el nombre de la columna que tiene el tipo como marca de tiempo
o
Para obtener la fecha de hoy, la función CURDATE () está disponible, por lo que:
fuente
Simplemente envíelo a una fecha:
fuente
Este podría ser el más fácil en mi opinión:
fuente
O puede usar la alternativa CURRENT_DATE, con el mismo resultado:
Ejemplos de database.guide
fuente
En Visual Studio 2017, al usar la base de datos incorporada para el desarrollo, tuve problemas con la solución actual dada, tuve que cambiar el código para que funcionara porque arrojó el error de que DATE () no era una función incorporada.
Aquí está mi solución:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
fuente