gpt4 book ai didi

postgresql - 如何在 Ecto 片段语句中使用带时区的 date_trunc

转载 作者:行者123 更新时间:2023-11-29 14:36:44 26 4
gpt4 key购买 nike

我正在尝试使用商店的时区查询商店的订单和 date_trunc 它的 inserted_at

以下有效。

shop |> Ecto.assoc(:orders) |> select([o], fragment("date_trunc('day', ? at time zone 'America/Los_Angeles')", o.inserted_at)) |> Repo.all

但是当我尝试动态传递时区时,我得到“无法确定参数 $1 的数据类型”错误,即使我明确使用 type 将时区转换为字符串

shop |> Ecto.assoc(:orders) |> select([o], fragment("date_trunc('day', ? at time zone '?')", o.inserted_at, type(^timezone, :string))) |> Repo.all


** (Postgrex.Error) ERROR 42P18 (indeterminate_datatype): could not determine data type of parameter $1
[debug] QUERY ERROR source="orders" db=1.0ms
SELECT date_trunc('day', o0."inserted_at" at time zone '$1::varchar') FROM "orders" AS o0 WHERE (o0."shop_id" = $2) ["America/Los_Angeles", "QXJnQWw2NWxhS289"]
(ecto) lib/ecto/adapters/sql.ex:436: Ecto.Adapters.SQL.execute_and_cache/7
(ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5
(ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4

在这里使用 elixir 1.4.1 和 ecto 2.1.4。

如何正确查询?

提前致谢!

最佳答案

当使用 fragment 时,您不需要在 SQL 中围绕 ? 进行引号(并且在修复引号错误后,您也不需要显式类型转换) :

shop |> Ecto.assoc(:orders) |> select([o], fragment("date_trunc('day', ? at time zone ?)", o.inserted_at, ^timezone)) |> Repo.all

关于postgresql - 如何在 Ecto 片段语句中使用带时区的 date_trunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43288914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com