Ecto/Elixir,我如何按日期查询?

D.R*_*D.R 14 datetime elixir ecto

我正在处理我的应用程序的统计页面,并尝试按日期查询数据.

为了获得日期范围,我使用 Calendar.Date

date_range = Date.days_after_until(start_date, end_date, true)
|> Enum.to_list
Run Code Online (Sandbox Code Playgroud)

它返回日期的日期列表,每个日期看起来像"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]

对于created_date秩序领域,我做了这样的领域, field :created_date, Ecto.DateTime.

如果我想按日期查询,我该如何查询?

预先感谢.

Dog*_*ert 29

看起来您正在尝试比较日期和日期时间.您需要将其中一个转换为另一个类型,以便进行比较,例如将数据库中的日期时间转换为日期:

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

或将Elixir转换DateNaiveDateTime:

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

如果您有开始日期和结束日期,则只需添加一个and.您不需要使用任何库生成整个日期列表.

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

要么

from p in Post,
  where: p.inserted_at >= ^start_datetime and
         p.inserted_at <= ^end_datetime
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在最新的 Ecto 版本中,可以使用 https://hexdocs.pm/ecto/Ecto.Query.API.html#type/2 函数进行没有片段的转换 (3认同)