2017-04-08 7 views
1

私は自分のアプリの統計ページに取り組んでいて、データを日付で照会しようとしています。Ecto/Elixir、日付で質問するにはどうすればよいですか?

日付範囲を取得するには、私はCalendar.Date

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

を使用して、それは、日付の日付のリストを返し、それぞれの日付が"2017-04-07"のように見えます。だから私はdate_rangeから取得した日付で、私はクエリを試みたが、それは以下のようなエラーを引き起こします。注文のcreated_dateフィールドで

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

、私はこの、 field :created_date, Ecto.DateTimeのような場を作りました。

日付でクエリを実行する場合は、どのようにクエリを実行できますか?

ありがとうございます。

+0

あなたが走った正確なクエリとは何ですか? – Dogbert

答えて

6

日付と日時を比較しようとしているようです。比較が機能するように、一方のタイプを他方のタイプにキャストする必要があります。これまでにデータベースに日時を変換:

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

またはNaiveDateTimeにエリクサーDateを変換:

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

あなたは、開始日と終了日を持っている場合は、あなただけのいずれかにandを追加する必要があります。任意のライブラリを使用して、日付のリスト全体を生成する必要はありません。

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

または

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

ありがとう!私はdatetimeに日付を変更した後、それは動作します! –

関連する問題