【问题标题】:Date and time in UTC - how to store them in postgres?UTC 中的日期和时间 - 如何将它们存储在 postgres 中?
【发布时间】:2017-06-08 10:04:23
【问题描述】:

我正在获取我的数据:UTC 日期和时间,在单独的列中以 csv 文件格式。由于我需要将此区域转换为我住的地方的日期和时间,目前在夏天到 UTC+2,也许还有其他一些区域,我想知道在我们谈论的时候在 postgres 中插入数据的最佳做法是什么数据类型。我应该将我的两个数据放在一个列中还是将它们作为类型分开:日期和时间,如果不是,我应该使用时间戳或时间戳z(或其他东西)。

【问题讨论】:

    标签: postgresql date time timestamp timestamp-with-timezone


    【解决方案1】:

    使用timestamptz 它将以UTC 格式存储您的时间戳。并将根据其语言环境将其显示给客户端。

    https://www.postgresql.org/docs/current/static/datatype-datetime.html

    对于带时区的时间戳,内部存储的值始终在 UTC(通用协调时间,传统上称为格林威治标准时间) 时间,格林威治标准时间)。指定了明确时区的输入值是 使用该时区的适当偏移量转换为 UTC。如果 输入字符串中没有说明时区,则假定为 在系统的 TimeZone 参数指示的时区,并且是 使用时区的偏移量转换为 UTC。

    当一个带有时区值的时间戳被输出时,它总是 从 UTC 转换为当前时区,并显示为 该区域的当地时间。要查看另一个时区的时间,要么 更改时区或使用 AT TIME ZONE 构造(参见第 9.9.3 节)。

    更新了 Lukasz 的另一个优点,我不得不提一下:

    另外一个支持单列的事实是,如果您要存储 日期和时间都在单独的列中,您仍然需要合并 如果您想更改时区,则将它们转换为时间戳 日期。

    不这样做会导致日期 '2017-12-31' 与时间 '23:01:01' 在其他时区实际上不仅是不同的时间,而且是不同的日期,所有 YEAR 和 MONTH 和 DAY 都不同

    另一个更新根据 Laurenz 通知,不要忘记上面的文档引用 具有指定明确时区的输入值将使用该时区的适当偏移量转换为 UTC。这意味着您必须仔细管理输入日期。例如:

    t=# create table t(t timestamptz);
    CREATE TABLE
    t=# set timezone to 'GMT+5';
    SET
    t=# insert into t select '2017-01-01 00:00:00';
    INSERT 0 1
    t=# insert into t select '2017-01-01 00:00:00' at time zone 'UTC';
    INSERT 0 1
    t=# insert into t select '2017-01-01 00:00:00+02';
    INSERT 0 1
    t=# select * from t;
               t
    ------------------------
     2017-01-01 00:00:00-05
     2017-01-01 05:00:00-05
     2016-12-31 17:00:00-05
    (3 rows)
    

    【讨论】:

    • 另外一个支持单列的事实是,如果您将日期和时间存储在单独的列中,如果您想更改日期的时区,您仍然需要将它们组合并转换为时间戳。例如 2017-06-08 04:00:00 GMT +7 是 2017-06-07 21:00:00 UTC。
    • 你应该告诉如果输入是UTC,你要么必须将TimeZone设置为UTC,要么使用TIMESTAMP '<UTC-string>' AT TIME ZONE UTC
    • 谢谢大家!
    • 客户是什么意思?应用程序的客户端还是直接连接到数据库的客户端?
    • 数据库客户端
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 2016-08-07
    • 2011-06-06
    • 1970-01-01
    • 2010-11-23
    • 2011-04-17
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多