2013-03-03 13 views
5

Jak grupować według godziny w Postgresie & Rails? Przeczytałem kilka odpowiedzi na SO, ale dostaję błędy.Railsy i PostgreSQL: jak grupować zapytania według godziny?

To działa podczas grupowania według daty:

Model.group("date(updated_at)").count 

Potem próbowałem następujące za godzinę, ale nie działa:

Model.group("hour(updated_at)").count 
Model.group("date_format(updated_at, '%H')").count 
Model.group("extract(hour from updated_at)").count 

Raz znalazłem pewne godziny muszę zaktualizować , w jaki sposób otrzymam modele z tymi godzinami? Tj:

Model.where("hour(updated_at) = ?", 5) 

Odpowiedz

12

Można wypróbować następujące

Model.group("DATE_PART('hour', updated_at)").count 

UPDATE:

Jak znaleźć rekordy

Model.where("DATE_PART('hour', updated_at) = ?", 5) 
+0

Dzięki, to działa. Czy możesz popatrzeć na moje zaktualizowane pytanie - jak uruchomić drugie zapytanie? –

+0

spójrz na zaktualizowaną odpowiedź – jvnill

+0

Doskonale, dziękuję. –

0

PostgreSQL przedstawia dwa sposoby, aby wyodrębnić część daty/time:

EXTRACT to standardowa funkcja SQL, która istnieje w innych bazach danych SQL.

Model.group("EXTRACT(hour FROM created_at)").count 
Model.where("EXTRACT(hour FROM created_at) = ?", 5) 

date_part funkcja

Model.group("date_part('hour', updated_at)").count 
Model.where("date_part('hour', updated_at) = ?", 5) 

Oficjalna documentation.

0

Jeśli chcesz zarówno datę i godzinę, można użyć date_trunc:

Model.group("date_trunc('hour', created_at)").count

A jeśli chcesz odpowiedzi w kolejności:

Model.order("date_trunc('hour', created_at)").group("date_trunc('hour', created_at)").count

Tak to jest dziwne, że nie możesz po prostu zrobić order(:created_at), ale no cóż.

Powiązane problemy