web-dev-qa-db-ja.com

Ecto / Elixir、日付でクエリするにはどうすればよいですか?

アプリの統計ページで作業しており、日付でデータをクエリしようとしています。

日付範囲を取得するには、Calendar.Dateを使用します

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

そして、日付の日付リストを返し、各日付は"2017-04-07"のようになります。 date_rangeから取得した日付でクエリを実行しようとしましたが、次のようなエラーが発生します。

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

Orderのcreated_dateフィールドについては、field :created_date, Ecto.DateTimeのようなフィールドを作成しました。

日付でクエリを実行する場合、どうすればクエリできますか?

少し早いですがお礼を。

15
D.R

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

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

または、Elixir DateNaiveDateTimeに変換します。

{: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
27
Dogbert