myc*_*tea 12 postgresql time timestamp date timestamp-with-timezone
我收到我的数据:UTC中的日期和时间,在单独的列中以csv文件格式.因为我需要将这个区域转换为我住的地方的日期和时间,目前在夏天到UTC + 2,也许还有其他一些区域我想知道在我们谈论的时候在postgres中插入数据的最佳做法是什么数据类型.我应该将我的两个数据放在一个列中,还是将它们分开作为类型:日期和时间,如果不是,我应该使用时间戳或时间戳(或其他).
Vao*_*sun 17
使用timestamptz它将以UTC格式存储您的时间戳.并根据它的区域设置将其显示给客户端.
https://www.postgresql.org/docs/current/static/datatype-datetime.html
对于带时区的时间戳,内部存储的值始终为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)
Run Code Online (Sandbox Code Playgroud)