Почему поле с учетом часового пояса наивно в postgres - PullRequest
0 голосов
/ 27 мая 2020

Я добавляю в свою схему столбец с учетом часового пояса ut c. Однако в моей базе данных столбец набран как отметка времени (0) без зоны.

Что я сделал не так? Моя схема выглядит так:

defmodule Transaction do
    use Ecto.Schema
    import Ecto.Changeset

    schema "transaction" do
      field :platform_transaction_at, :utc_datetime
    end
end 

Мой файл миграции выглядит как

defmodule Transaction.Migrations.AddPlatformTransactionDatetime do
  use Ecto.Migration

  def change do
    alter table(:transaction) do
      add :platform_transaction_at, :utc_datetime
    end
  end
end

1 Ответ

2 голосов
/ 27 мая 2020

PostgreSQL не имеет типа данных для хранения метки времени с часовым поясом. См. эту ветку форума об эликсире для более подробного обсуждения. Вы можете возразить, что действительно существует тип, называемый «отметка времени с часовым поясом», но ответ в этом потоке дополнительно объясняет: введите временную метку в UT C и преобразуйте ее обратно в любой часовой пояс вашего соединения с БД при чтении (поэтому в большинстве случаев это бесполезно). Он даже не сохраняет смещение / часовой пояс. Так что вам нужно как-то сделать это самостоятельно.

И :utc_datetime, и :naive_datetime в миграциях Ecto создают один и тот же тип в Postgres: timestamp without time zone http://www.creativedeletion.com/2019/06/17/utc-timestamps-in-ecto.html

Хорошая новость заключается в том, что вы уже правильно сохраняете свои временные метки, указав :utc_datetime в своей схеме и миграции, потому что, даже если он становится timestamp without timezone, «все даты и время с учетом часовых поясов сохраняются внутри. в UT C. " https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE -ЧАСЫ

...