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_at
和 updated_at
)默认为 :naive_datetime
类型。如果它们是 :utc_datetime
,它会为您完成转换。
(完整对话在这里:https://elixirforum.com/t/functions-used-in-db-field/12673)
我正在使用 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_at
和 updated_at
)默认为 :naive_datetime
类型。如果它们是 :utc_datetime
,它会为您完成转换。
(完整对话在这里:https://elixirforum.com/t/functions-used-in-db-field/12673)