2016-07-28 19 views
1

Ich mache eine Ecto-Abfrage und versuche, durch q.created_date zu gruppieren. Diese Abfrage führt die GROUP BY erfolgreich durch, aber es tut es in der Sekunde. Ich versuche stattdessen nach Monat zu gruppieren.Wie schreibe ich eine Ecto-Abfrage, die ein Group_by MONTH auf einem Datetime-Feld

MYQUERY |> group_by([q], [q.created_date, q.id]) 

Gibt es so etwas wie:

MYQUERY |> group_by([q], [month(q.created_date), q.id]) 
+0

Welche Datenbank verwenden Sie? PostgreSQL? – Dogbert

+0

Ja, PostgreSQL. – gkkirsch

Antwort

4

Sie fragment mit date_part('month', field) verwenden können, um den Monat in PostgreSQL zu extrahieren: fragment("date_part('month', ?)", p.inserted_at))

iex(1)> from(Post) |> select([p], p.inserted_at) |> Repo.all 
[debug] QUERY OK db=1.1ms queue=0.1ms 
SELECT p0."inserted_at" FROM "posts" AS p0 [] 
[#Ecto.DateTime<2000-01-01 00:00:00>, #Ecto.DateTime<2000-02-02 00:00:00>, 
#Ecto.DateTime<2000-03-03 00:00:00>, #Ecto.DateTime<2000-04-04 00:00:00>, 
#Ecto.DateTime<2000-04-02 00:00:00>, #Ecto.DateTime<2000-03-02 00:00:00>, 
#Ecto.DateTime<2000-02-02 00:00:00>, #Ecto.DateTime<2000-01-02 00:00:00>] 
iex(2)> from(Post) |> group_by([p], fragment("date_part('month', ?)", p.inserted_at)) |> select([p], count("*")) |> Repo.all 
[debug] QUERY OK db=1.7ms 
SELECT count('*') FROM "posts" AS p0 GROUP BY date_part('month', p0."inserted_at") [] 
[2, 2, 2, 2] 
+0

Achten Sie nur auf den Unterschied zwischen 'date_part' und' date_trunc'. Verwenden Sie trunc für nicht überlappende Gruppierungen. – arvidkahl