【问题标题】:Alter table with timestamp with time zone need to migrate old data or notAlter table with timestamp with time zone 是否需要迁移旧数据
【发布时间】:2017-05-15 12:06:36
【问题描述】:

我有一个要求,需要将我在 postgres 中使用无时区时间戳的表更改为带有时区的时间戳。所需的表已经填充了旧数据,所以如果我尝试:

 ALTER TABLE mytable ALTER COLUMN createdat TYPE timestamp with time zone;

这是否应该更改所有现有记录? 我看到了变化,但不确定这是否真的在记录中添加了时区条目(“欧洲/伦敦”)。

不带时区记录:2017-05-15 02:19:02.443 以及更改表并添加带时区时间戳时:2017-05-14 05:47:43.523+00

我可以通过在我的数据库上运行它来确认当前时区:

SELECT  current_setting('TIMEZONE')

欧洲/伦敦

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    timestamp with time zone 不在 PostgreSQL 中存储时区信息,它存储了一个 UTC 时间戳,该时间戳在检索时转换为会话时区。

    您显示的ALTER TABLE 将解释当前会话时区中的timestamp without time zone 值,因此如果要在Europe/London 时区中解释您的所有数据,则结果应该是正确的。

    如果您需要存储时间戳的时区,例如要保留输入时区,您必须将时区存储为单独的字段。

    SHOW TimeZone;
    ┌───────────────┐
    │   TimeZone    │
    ├───────────────┤
    │ Europe/Vienna │
    └───────────────┘
    (1 row)
    
    CREATE TABLE mytime(
       id integer PRIMARY KEY,
       ts timestamp without time zone NOT NULL
    );
    
    INSERT INTO mytime VALUES (1, '2017-05-15 12:00:00');
    
    SELECT * FROM mytime;
    ┌────┬─────────────────────┐
    │ id │         ts          │
    ├────┼─────────────────────┤
    │  1 │ 2017-05-15 12:00:00 │
    └────┴─────────────────────┘
    (1 row)
    
    ALTER TABLE mytime ALTER ts TYPE timestamp with time zone;
    
    SELECT * FROM mytime;
    ┌────┬────────────────────────┐
    │ id │           ts           │
    ├────┼────────────────────────┤
    │  1 │ 2017-05-15 12:00:00+02 │
    └────┴────────────────────────┘
    (1 row)
    

    如果我更改时区,显示的值会发生变化:

    SET TimeZone = 'Asia/Kolkata';
    
    SELECT * FROM mytime;
    ┌────┬───────────────────────────┐
    │ id │            ts             │
    ├────┼───────────────────────────┤
    │  1 │ 2017-05-15 15:30:00+05:30 │
    └────┴───────────────────────────┘
    (1 row)
    

    【讨论】:

    • 在alter table中添加新记录显示如下:“2017-05-15 14:12:19.26491+02”我很困惑,随着时间的推移,alter table 后现有记录出了什么问题区域
    • 正如我上面提到的,现有日期显示如下:2017-05-14 05:47:43.523+00。当我添加新的数据日期字段时,如下所示:2017-05-15 14:12:19.26491+02。我只是想确认现有日期现在是否转换为时区?
    • 是的,它们是,而且我不相信如果你运行SELECT * FROM mytable,你可以得到一些用+00 显示的值,而另一些用+02 时区偏移量显示的值。所有值都将显示在同一时区,即使用TimeZone 参数设置的会话时间。
    猜你喜欢
    • 2012-04-04
    • 2016-07-09
    • 2021-08-24
    • 2023-01-10
    • 2020-09-20
    • 1970-01-01
    • 2011-03-14
    • 2011-05-03
    • 2012-01-07
    相关资源
    最近更新 更多