如何在postgresql 8.3中知道时间戳的时区

如何在postgresql 8.3中知道时间戳的时区,postgresql,timezone,Postgresql,Timezone,我使用的是postgresql 8.3,我想知道特定时间戳(表中的一列)的时区 在文档中我找到了关键字 但我不明白如何在表的列中应用它。可能吗?我假设您有一个名为ct的列,其类型为timestamtz,在表t中。然后您可以使用: SELECT EXTRACT(TIMEZONE FROM ct) FROM t; 以秒为单位获取时区的偏移量。它从UTC/GMT向您提供3600,这意味着GMT+1,CET或其他任何内容。返回的值取决于您的时区设置 样本(我住在德国,实际时区为istGMT+1/CET

我使用的是postgresql 8.3,我想知道特定时间戳(表中的一列)的时区

在文档中我找到了关键字


但我不明白如何在表的列中应用它。可能吗?

我假设您有一个名为
ct
的列,其类型为
timestamtz
,在表
t
中。然后您可以使用:

SELECT EXTRACT(TIMEZONE FROM ct) FROM t;
以秒为单位获取时区的偏移量。它从
UTC
/
GMT
向您提供
3600
,这意味着
GMT+1
CET
或其他任何内容。返回的值取决于您的
时区设置

样本(我住在德国,实际时区为ist
GMT+1
/
CET
):

正如您所看到的,它总是输出配置时区中的任何内容。因此,使用
提取(时区从…
获取)得到的偏移量取决于
时区设置。
INSERT
上给出的时区丢失,因为它不值得保存。重要的是一切都是正确的,这不应该取决于
时区设置。PostgreSQL做得很好。

“PostgreSQL做得很好。”

我真的很喜欢PostgreSQL,但在这个特性上它做得并不好。时区不仅与格林尼治标准时间偏移。时区严格遵守暗示夏时制的政治规则。由于有很多时区具有相同的偏移量和不同的夏令时规则-当PG忘记了原始时区时,实际上会丢失信息


就我个人而言,我以“美国/纽约”的形式分别存储原始时区的重要日期。如果有人有更好的解决方案,那就欢迎了。

因为时间戳在祖鲁/GMT时间内被记录了一个瞬间,它永远不会改变它的偏移量(因为它是引用),所以不需要记录时区。您只需将偏移量添加/减去过去、现在或未来的地缘政治时区偏移量

您确实需要知道在过去和现在适用的时间所在地生效的确切地缘政治时区

对于未来的实例来说,这可能会带来更多的问题。但它应该仍然有效。想想日落。如果地球的某个位置在祖鲁时间午夜日落(北半球冬季大西洋或加拿大北部到阿拉斯加的某个地方),则该时间假定为晚上8点(-4:00偏移)在该位置,当您将其记录在系统中并将其记录为“未来8:00 PM的冬季日期”时,它将在数据库中记录为24:00 GMT


现在,地球上的那个位置在地理相关的时间推算中变得异常活跃,并称他们的时区为“+11:55”。所以对于他们来说,当英国的午夜(格林尼治标准时间午夜)时,他们想把它称为上午11:55,这完全是他们的选择。当任何计算机希望在将来显示该位置(即该地缘政治时区)的日期时,他们将称之为上午11:55,即使太阳正在落山。当然,这将是您计划的前一天:-)他们的问题。

在Postgres中,即使您将日期时间值存储在带有时区数据类型的时间戳中,原始输入时区也会丢失

缺点:
比如说,我是否有全世界人们使用facebook应用程序的日期时间数据(以及时区信息)。现在,我使用时区数据类型将这些值存储在时间戳中。随机的一天,我想看看人们早上使用他们的FB应用程序的次数与晚上相比有多大,以及各国是否也出现了同样的趋势。 但是等等,我不再有时区信息了。 坐在华盛顿特区,我能看到的是,当美国东部时间上午10点时,这项活动在全世界范围内展开

优势:
如果您正在比较两个具有相同时区时间戳的数据源,但其中一个存储为本地手表显示的数据源,而另一个存储为将其转换为UTC。在这里,您只需将时间戳存储在timestamptz数据类型中,并告诉它所属的时区,然后就可以轻松地进行比较。
例如,
在2014-10-19 10:23:54
记录了PST时区的活动。现在,两个独立的数据源分别存储它。数据源1将其存储为
2004-10-19 10:23:54 PST
,数据源2将其存储为
2014-10-19 18:23:54 UTC
。如果它们存储在timestamptz数据类型中,它将在您执行此操作时显示相同的时间

SELECT datasource1.time, datasource2.time 

是的,pg类型名称“带时区的时间戳”有误导性。真正保存在数据库中的信息与“没有时区的时间戳”相同。唯一的变化是在输入和输出时刻,从UTC到全球时区的实时转换。因此,pg类型“带时区的时间戳”不保存时区信息。
SELECT datasource1.time, datasource2.time