我正在使用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转换为本地时区以返回正确的结果。
有办法做到这一点吗?
答案 0 :(得分:1)
在进行查询之前,您需要将input_date
转换为正确的时区。
input_date
|> Date.from_iso8601!()
|> Timex.to_datetime(timezone)
|> Timex.to_datetime()
这应该将输入日期转换为您要与之比较的时区,然后将其转换为该日期时间的UTC表示,以便在ecto查询中进行比较。
请注意,您需要自己将其转换为UTC的唯一原因是时间戳(inserted_at
和updated_at
)默认为:naive_datetime
类型。如果它们是:utc_datetime
,则会为您完成转换。
(完整对话:https://elixirforum.com/t/functions-used-in-db-field/12673)