Ecto考虑时区

时间:2018-02-21 17:11:06

标签: timezone elixir ecto

我正在使用Ecto对postgres db进行查询。

问题是db的字段包含utc datetime,但是我需要在比较之前将这些数据转换为本地时区。

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

上面的表达式将以utc格式考虑created_at进行比较。我不想要这个。我想在比较之前将Ecto convert created_at转换为本地时区以返回正确的结果。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

在进行查询之前,您需要将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