Ecto - 按月访问日期时间字段

Ecto - accessing datetime fields by month

defp query_by(query, %{"min_end_date_month" => min_end_date_month} = params) do
  query = from(q in query, where: q.end_date.month <= ^min_end_date_month)

  query_by(query, Map.delete(params, "min_end_date_month"))
end

上面的查询函数返回此错误:(Ecto.Query.CompileError) q.start_date().year() is not a valid query expression。但是,在 iex 控制台中,我通常可以执行 some_record.end_date.month 因为 month 是一个有效的密钥。我做错了什么?

当向 Elixir 查询 returns 日期值时,Elixir 将其解码为 Date 结构,这使您可以使用 .year、[=13] 访问日期的各个部分=], 等等。虽然查询是由数据库执行的,但您无法使用 . 访问 year/month/day。有一些特定于数据库的函数可以从日期值中提取这些值。假设您使用的是 PostgreSQL,您可以使用 date_part:

query = from(q in query, where: fragment("date_part('month', ?)", q.end_date) <= ^min_end_date_month)