UTC 中的日期和时间 - 如何将它们存储在 postgres 中?
Date and time in UTC - how to store them in postgres?
我正在获取我的数据:UTC 日期和时间,以 csv 文件格式在单独的列中。因为我需要将这个区域转换为我居住地的日期和时间,目前在夏天转换为 UTC+2,也许还有其他一些区域我想知道在我们谈论时在 postgres 中插入数据的最佳实践是什么数据类型。我应该将我的两个数据放在一个列中还是将它们按类型分开:日期和时间,如果不是,我应该使用 timestamp 或 timestampz(或其他东西)。
使用 timestamptz
它将以 UTC 格式存储您的时间戳。并将根据其语言环境将其显示给客户端。
https://www.postgresql.org/docs/current/static/datatype-datetime.html
For timestamp with time zone, the internally stored value is always in
UTC (Universal Coordinated Time, traditionally known as Greenwich Mean
Time, GMT). An input value that has an explicit time zone specified is
converted to UTC using the appropriate offset for that time zone. If
no time zone is stated in the input string, then it is assumed to be
in the time zone indicated by the system's TimeZone parameter, and is
converted to UTC using the offset for the timezone zone.
When a timestamp with time zone value is output, it is always
converted from UTC to the current timezone zone, and displayed as
local time in that zone. To see the time in another time zone, either
change timezone or use the AT TIME ZONE construct (see Section 9.9.3).
更新 Lukasz 的另一个好点,我不得不提到:
Also in favor of single column is the fact that if you would store
both date and time in separate columns you would still need to combine
them and convert to timestamp if you wanted to change time zone of
date.
不这样做会导致日期为“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)
我正在获取我的数据:UTC 日期和时间,以 csv 文件格式在单独的列中。因为我需要将这个区域转换为我居住地的日期和时间,目前在夏天转换为 UTC+2,也许还有其他一些区域我想知道在我们谈论时在 postgres 中插入数据的最佳实践是什么数据类型。我应该将我的两个数据放在一个列中还是将它们按类型分开:日期和时间,如果不是,我应该使用 timestamp 或 timestampz(或其他东西)。
使用 timestamptz
它将以 UTC 格式存储您的时间戳。并将根据其语言环境将其显示给客户端。
https://www.postgresql.org/docs/current/static/datatype-datetime.html
For timestamp with time zone, the internally stored value is always in UTC (Universal Coordinated Time, traditionally known as Greenwich Mean Time, GMT). An input value that has an explicit time zone specified is converted to UTC using the appropriate offset for that time zone. If no time zone is stated in the input string, then it is assumed to be in the time zone indicated by the system's TimeZone parameter, and is converted to UTC using the offset for the timezone zone.
When a timestamp with time zone value is output, it is always converted from UTC to the current timezone zone, and displayed as local time in that zone. To see the time in another time zone, either change timezone or use the AT TIME ZONE construct (see Section 9.9.3).
更新 Lukasz 的另一个好点,我不得不提到:
Also in favor of single column is the fact that if you would store both date and time in separate columns you would still need to combine them and convert to timestamp if you wanted to change time zone of date.
不这样做会导致日期为“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)