【问题标题】:Add interval to timestamp using Ecto Fragments使用 Ecto Fragments 将时间间隔添加到时间戳
【发布时间】:2021-03-18 20:08:10
【问题描述】:

我想使用 Ecto 片段在 phoenix 应用程序中编写以下查询:

select *
from (
  select id, 
  inserted_at + interval '1 day' * expiry as deadline
  from friend_referral_code
) t
where localtimestamp at time zone 'UTC' > deadline

expiry 的值是一个整数值,代表天数。到目前为止我得到的是这样的:

query = from frc in FriendReferralCode,
  where: fragment("localtimestamp at time zone 'UTC'") > fragment("? + INTERVAL '1' * ?", frc.inserted_at, frc.expiry)

FriendReferralCode
|> Repo.all(query)
|> Enum.each(fn frc -> update_friend_referral_code_users(get_friend_referral_code_users_by(receiver_id: frc.id), %{status: false}) end)
|> IO.puts()

结束

但它会引发以下错误:

** (EXIT) an exception was raised:
        ** (FunctionClauseError) no function clause matching in Keyword.merge/2
            (elixir 1.11.2) lib/keyword.ex:764: Keyword.merge([], #Ecto.Query<from f0 in Stakester.Accounts.FriendReferralCode, where: fragment("localtimestamp at time zone 'UTC'") > fragment("? + INTERVAL '1 day' * ?", f0.inserted_at, f0.expiry)>)

【问题讨论】:

  • 问题是?
  • @AdrianKlaver 如何使用片段在长生不老药中编写它

标签: postgresql elixir phoenix-framework


【解决方案1】:

您在Ecto.Query.API.ago/2Ecto.Query.API.from_now/2 之后查询间隔 Ecto.Query.subquery/2 用于内部select


另外,Repo.all/2 需要一个查询作为第一个参数,而您将 FriendReferralCode 作为调用中的第一个参数传递给 Repo.all/2,它需要一个查询,query 作为第二个参数,其中它需要一个选项的关键字列表。

改用query |&gt; Repo.all()

【讨论】:

  • 你能看看我的查询并告诉我哪里错了吗? @AlekseiMatiuskhkin
  • 从错误消息中可以看出,查询(这个特定的部分)是正确构建的。如果您希望获得任何有意义的帮助,请分享代码、完整的错误消息,并指出您遇到困难的部分。
  • 我已经编辑了我的问题并添加了长生不老药代码,请查看
  • 啊!!这么愚蠢的错误。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2015-03-09
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
相关资源
最近更新 更多