Ecto 考虑时区

Ecto considering timezone

我正在使用 Ecto 在 postgres 数据库上进行查询。

问题是数据库有带有 utc 日期时间的字段,但我需要在比较之前查询将此数据转换为本地时区。

from(u in User) |> where([u], u.created_at < ^input_datetime) |> Repo.all

上面的表达式会考虑utc格式的created_at来进行比较。我不想要这个。我希望 Ecto 在与 return 正确结果进行比较之前将 created_at 转换为本地时区。

有办法吗?

在进行查询之前,您需要将 input_date 转换为正确的时区。

input_date
|> Date.from_iso8601!()
|> Timex.to_datetime(timezone)
|> Timex.to_datetime()

这应该将输入日期转换为您想要与之比较的任何时区,然后将其转换为该日期时间的 UTC 表示,以便在 ecto 查询中进行比较。

请注意,您需要自己将其转换为 UTC 的唯一原因是时间戳(inserted_atupdated_at)默认为 :naive_datetime 类型。如果它们是 :utc_datetime,它会为您完成转换。

(完整对话在这里:https://elixirforum.com/t/functions-used-in-db-field/12673