采用以下示例:
create temporary table t1 (c1 timestamp with time zone);
insert into t1 values ('2003-04-12 04:05:06 America/New_York'::timestamp with time zone);
如果我正确阅读文档,这里Postgresql将使用完整的时区名称通过添加+05:00小时将时间戳转换为UTC,然后存储。
但如果这是真的那么我就无法区分2003-04-12 04:05:06 America/New_York
和2003-04-12 04:05:06 America/Panama
,它们具有相同的UTC偏移但是夏令时偏移量不同。
是吗?
答案 0 :(得分:2)
PostgreSQL不存储原始时区。您可以在需要时将其作为单独的列进行。
http://postgres.cz/wiki/PostgreSQL_SQL_Tricks_III#Domain_for_time_zone
CITEXT是PostgreSQL contrib包中不区分大小写的文本类型。如果您不想安装文本,可以使用文本。
答案 1 :(得分:0)
虽然确实一旦存储,就无法进入原始命名的时区。我相信当存储带有时区的时间戳时,它会在转换为postgres时转换为时间戳并偏移+ - HHMM,包括时区的夏令时。我做了一个实验:
create temporary table t1 (c1 timestamp with time zone);
insert into t1 values ('2003-04-12 04:05:06 America/New_York'::timestamp with time zone);
insert into t1 values ('2003-04-12 04:05:06 America/Panama'::timestamp with time zone);
nsp=# select c1 at time zone 'utc' from t1;
timezone
---------------------
2003-04-12 08:05:06
2003-04-12 09:05:06
(2 rows)
这些对我来说似乎是正确的。 2003年,巴拿马是UTC-5,没有夏令时。 2003年,America / New_York从4月6日(UTC-4)开始减去一小时。所以,时间是正确的,你可以分辨出两者之间的区别。
-g