2017-04-08 4 views
1

Ich arbeite auf der Statistikseite meiner App und versuche Daten nach Datum abzufragen.Ecto/Elixir, Wie kann ich nach Datum abfragen?

den Datumsbereich zu erhalten, verwende ich Calendar.Date

date_range = Date.days_after_until(start_date, end_date, true) 
|> Enum.to_list 

Und es gibt eine aktuelle Liste der Termine und jedes Datum sieht aus wie "2017-04-07". So mit dem Datum, das ich von date_range bekam, versuchte ich abzufragen, aber es löst einen Fehler wie unten aus.

where cannot be cast to type Ecto.DateTime in query: from o in Myapp.Order, where: o.created_date >= ^~D[2017-04-07]

Für created_date Bereich Ordnung, habe ich Feld wie diese, field :created_date, Ecto.DateTime.

Wenn ich nach Datum abfragen möchte, wie kann ich es abfragen?

Vielen Dank im Voraus.

+0

Was ist die genaue Abfrage, die Sie lief? – Dogbert

Antwort

6

Es sieht so aus, als ob Sie versuchen, ein Datum und ein Datum zu vergleichen. Sie müssen einen von ihnen in den anderen Typ umwandeln, damit der Vergleich funktioniert, z. die Datetime in der Datenbank zu einem Datum konvertieren:

date = ~D[2017-01-01] 
from p in Post, where: fragment("?::date", p.inserted_at) >= ^date 

oder das Elixier konvertieren Date zu NaiveDateTime:

{:ok, datetime} = NaiveDateTime.new(date, ~T[00:00:00]) 
from p in Post, where: p.inserted_at >= ^datetime 

Wenn Sie ein Start- und Enddatum haben, müssen Sie nur eine and hinzufügen, um entweder . Sie müssen nicht die gesamte Liste der Daten mithilfe einer Bibliothek generieren.

from p in Post, 
    where: fragment("?::date", p.inserted_at) >= ^start_date and 
     fragment("?::date", p.inserted_at) <= ^end_date 

oder

from p in Post, 
    where: p.inserted_at >= ^start_datetime and 
     p.inserted_at <= ^end_datetime 
+0

danke! nachdem ich Datum zu Datetime ändere, funktioniert es! –

Verwandte Themen