Ecto/Elixir, 如何按日期查询?
Ecto/Elixir, How can I query by date?
我正在处理我的应用程序的统计页面并尝试按日期查询数据。
要获取日期范围,我使用 Calendar.Date
date_range = Date.days_after_until(start_date, end_date, true)
|> Enum.to_list
它 returns 日期列表,每个日期看起来像 "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
.
如果我想按日期查询,怎么查询呢?
提前致谢。
您似乎在尝试比较日期和日期时间。您需要将其中一个转换为另一种类型,以便进行比较,例如将数据库中的日期时间转换为日期:
date = ~D[2017-01-01]
from p in Post, where: fragment("?::date", p.inserted_at) >= ^date
或将 Elixir Date
转换为 NaiveDateTime
:
{: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
我正在处理我的应用程序的统计页面并尝试按日期查询数据。
要获取日期范围,我使用 Calendar.Date
date_range = Date.days_after_until(start_date, end_date, true)
|> Enum.to_list
它 returns 日期列表,每个日期看起来像 "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
.
如果我想按日期查询,怎么查询呢?
提前致谢。
您似乎在尝试比较日期和日期时间。您需要将其中一个转换为另一种类型,以便进行比较,例如将数据库中的日期时间转换为日期:
date = ~D[2017-01-01]
from p in Post, where: fragment("?::date", p.inserted_at) >= ^date
或将 Elixir Date
转换为 NaiveDateTime
:
{: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