2012-05-28 19 views
7

Tengo una aplicación de rieles que tiene un modelo Checkin. Quiero encontrar todos los registros que están dentro de un rango de tiempo específico para el día actual. ¿Cómo escribiría un where para obtener todos los registros que se crearon entre las 12PM y las 4:30 PM?Consulta de raíles entre dos veces

+0

¿Qué base de datos está utilizando? las funciones para obtener la hora del día serán diferentes. Será más fácil si almacena la hora/minuto del día además del tiempo. –

+0

Estoy usando postgresql. Estoy usando la columna de marca de tiempo 'created_at' estándar que proporciona Rails –

Respuesta

36

La respuesta de @x1a4 debe ser buena para usted, pero puede hacerlo de una manera más legible y más corta, utilizando un rango.

Chekin.where(created_at: Time.parse("12pm")..Time.parse("4:30pm")) 

Se debe generar algo como:

SELECT "checkins".* 
FROM "checkins" 
WHERE ("checkins"."created_at" BETWEEN '2012-05-28 12:00:00.000000' AND '2012-05-28 16:30:00.000000') 

Puede cambiar Time.parse("12pm") con cualquier otra forma de crear un tiempo.

8

Esto parece que podría funcionar, asumiendo zona horaria UTC:

Record.where('created_at > ? AND created_at < ?', Date.today + 12.hours, Date.today + 16.5.hours) 

o con un BETWEEN:

Record.where('created_at BETWEEN ? AND ?', Date.today + 12.hours, Date.today + 16.5.hours) 

BETWEEN puede o no incluir el segundo valor en el rango. Postgres includes it.

0

Usted podría utilizar a continuación joya de encontrar los registros entre las fechas,

Este gem muy fácil de usar y más clara [Por estrellas] [1]. Estoy usando esta joya y la API es más clara y la documentación también está bien explicada.

Post.between_times(
Time.zone.now - 3.hours, # all posts in last 3 hours 
Time.zone.now 
) 

Aquí podría pasar nuestro campo también Post.by_month("January", field: :updated_at)

Por favor, consulte la documentación y probarlo.

Cuestiones relacionadas