2011-02-01 13 views
7

Tengo una columna llamada updatetime que es timestamp. Entonces, por ejemplo, un valor promedio podría ser: 2011-02-01 09:00:51. Quiero poder buscar y devolver todos los resultados para una hora particular del día, independientemente de la fecha.mysql - hora de búsqueda por hora del día

Por ejemplo si han buscado la columna para los valores BETWEEN 09:00:00 AND 09:59:99 volvería:

2011-02-01 09:00:51 
2011-01-31 09:20:51 
2011-01-11 09:55:44 
etc.... 

SELECT * FROM table WHERE updatetime ......

Pensamientos?

Respuesta

14

Se puede usar la función HOUR():

SELECT * FROM 'table' WHERE HOUR(`updatetime`) = 9 

Por desgracia, el rendimiento de esta consulta será horribles, tan pronto como usted se pasa de unos pocos miles de filas - funciones no son indexables, por lo que no será una exploración de tabla completa cada vez que se ejecuta esta consulta.

Lo que hicimos en una situación similar: creamos otra columna updatetime_hour, la indexamos y la rellenamos en la inserción (y la actualizamos en la actualización); a continuación, la consulta se hará más rápida:

SELECT * FROM 'table' WHERE `updatetime_hour` = 9 

sí, tenemos desnormalizado los datos, y es un poco más de limpieza, pero todavía tengo que ver una solución más rápida. (Hemos considerado y de inserción y actualización medido disparadores para poblar el updatetime_hour de updatetime, pero decidimos no para un rendimiento; ver si serían útiles para usted.)

+0

Buen punto una sobre el rendimiento. Puedo implementar una columna de hora indexada en la inserción lo suficientemente fácil, pero ¿alguna idea sobre cómo pasar a través de mis 60k filas anteriores y ACTUALIZAR con los datos de la columna "hora de actualización"? – themerlinproject

+1

@ user410341: Durante las horas de menor actividad, y con mucho cuidado;) 'ACTUALIZACIÓN programable SET updatetime_hour = HOUR (hora de actualización);' <- esto llevará un tiempo – Piskvor

+0

gracias, acabo de publicar como una nueva pregunta: http: // stackoverflow.com/questions/4866056/mysql-create-indexed-hour-column-from-existing-timestamp – themerlinproject

1

intento con HOUR():

SELECT * FROM table WHERE HOUR(updatetime) = 9; 

Esto devolverá todas las filas 09:00:00-9:59:59.

El HOUR() simplemente devuelve la parte de la hora de la fecha.

1
SELECT * FROM table WHERE hour('updatetime') = 9; 

regresarían 09 a.m. ..

0

Posibilidad: SELECT * FROM 'table' WHERE HOUR(updatetime)='09';

0

Estas respuestas no funcionan, esto es lo que funcionó para mí sólo

SELECT hour(FROM_UNIXTIME(`updatetime`)) AS date_formatted FROM `table` where hour(FROM_UNIXTIME(`updatetime`))='9' 
Cuestiones relacionadas