2012-05-28 17 views
7

Ho un'app per rotaie con un modello Checkin. Voglio trovare tutti i record che si trovano all'interno di un intervallo di tempo specifico per il giorno corrente. Come scrivere un where per ottenere tutti i record creati tra le 12:00 e le 16:30?Rails query tra due volte

+0

Quale database stai utilizzando? le funzioni per ottenere l'ora del giorno saranno diverse. Sarà più semplice se memorizzi l'ora/minuto del giorno in aggiunta al tempo. –

+0

Sto usando postgresql. Sto usando la colonna timestamp standard 'created_at' che Rails fornisce –

risposta

36

@ x1a4 La risposta dovrebbe essere buona per te, ma puoi farlo in un modo più leggibile e più breve, utilizzando un intervallo.

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

Si dovrebbe generare qualcosa come:

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

È possibile modificare Time.parse("12pm") con qualsiasi altro modo per creare un momento.

8

Questo appare come avrebbe funzionato, assumendo fuso orario 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 può o non può includere il secondo valore nella gamma. Postgres includes it.

0

Si potrebbe utilizzare sotto gemma per trovare i record tra le date,

Questo gem abbastanza facile da usare e più chiara [By stelle] [1]. Sto usando questo gioiello e l'API è più chiara e la documentazione è anche ben spiegata.

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

Qui si poteva passare il nostro campo anche Post.by_month("January", field: :updated_at)

consultare la documentazione e provarlo.