我以不同的列中的csv文件格式获取我的数据:UTC的日期和时间。因为我需要将这个区域转换为我住的地方的日期和时间,目前在夏天到UTC + 2,也许还有其他一些区域我想知道在我们谈论的时候在postgres中插入数据的最佳做法是什么数据类型。我应该将我的两个数据放在一个列中,还是将它们分开作为类型:日期和时间,如果不是,我应该使用时间戳或时间戳(或其他)。
答案 0 :(得分:13)
使用timestamptz
它会以UTC格式存储您的时间戳。并根据它的区域设置将其显示给客户端。
https://www.postgresql.org/docs/current/static/datatype-datetime.html
来自 Lukasz 的另一个好点对于带时区的时间戳,内部存储的值始终为 UTC(通用协调时间,传统上称为格林威治标准 时间,GMT)。具有指定显式时区的输入值是 使用该时区的适当偏移量转换为UTC。如果 在输入字符串中没有声明时区,则假定它是 在系统的TimeZone参数指示的时区中,是 使用时区的偏移量转换为UTC。
当输出带有时区值的时间戳时,它始终是 从UTC转换为当前时区,并显示为 该地区的当地时间。要查看另一个时区的时间,也可以 更改时区或使用AT TIME ZONE构造(参见第9.9.3节)。
更新了,我不得不提到:
同样支持单列的事实是,如果你要存储 您仍需要合并的单独列中的日期和时间 他们并转换为时间戳,如果你想改变时区 日期。
不这样做会导致日期'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)