为什么在postgres中没有时区感知字段时区天真

问题描述 投票:0回答:1

我正在向方案添加一个utc时区识别列。但是,在我的数据库中,该列的类型为timestamp(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
elixir ecto
1个回答
0
投票

PostgreSQL没有用于存储带时区的时间戳的数据类型。有关更多讨论,请参见this elixir forum thread。您可能会反对确实存在一个名为“带时区的时间戳”的类型,但是该线程中的答案进一步说明了:

存在一个带有时区的令人困惑的时间戳,但它所做的只是将您输入的时间戳转换为UTC,并在读取时将其转换回数据库连接的时区(因此在大多数情况下是无用的)。它甚至不存储偏移量/时区。因此,您需要自己进行某种操作。

Ecto迁移中的:utc_datetime:naive_datetime都在Postgres中创建了相同的类型:timestamp without time zone http://www.creativedeletion.com/2019/06/17/utc-timestamps-in-ecto.html

© www.soinside.com 2019 - 2024. All rights reserved.