我正在使用 postgresql 8.3,我想知道特定时间戳(表中的列)的时区。
在文档中我找到了关键字“时区”
但我不明白如何将它应用到表格的列中。是否可以 ?
我假设您有一个名为的列,该列具有table 中ct
的类型。然后你可以使用:TIMESTAMPTZ
t
SELECT EXTRACT(TIMEZONE FROM ct) FROM t;
以秒为单位获取时区的偏移量。它3600
从UTC
/给你,GMT
这意味着要么GMT+1
,CET
要么什么。返回的值取决于您的TIMEZONE
设置。
示例(我住在德国,实际时区是GMT+1
/ CET
):
test=# select '2008-01-01 12:00:00 GMT+5'::timestamptz;
timestamptz
------------------------
2008-01-01 18:00:00+01
test=# set timezone to 'gmt';
SET
test=# select '2008-01-01 12:00:00 GMT+5'::timestamptz;
timestamptz
------------------------
2008-01-01 17:00:00+00
如您所见,它始终在配置的时区输出任何内容。因此,您将获得的偏移量EXTRACT(TIMEZONE FROM ...)
取决于您的TIMEZONE
设置。给出的时区INSERT
丢失了,因为它不值得保存。重要的是一切都是正确的,这不应该取决于TIMEZONE
设置。PostgreSQL 在这方面做得很好。
“PostgreSQL 在这方面做得很好。”
我真的很喜欢 PostgreSQL,但在这个特殊的特性中它做得不好。时区不仅偏移到 GMT。时区严格遵守暗示夏令时的政治规则。由于有很多时区具有相同的偏移量和不同的夏令时规则 - 当 PG 忘记原始时区时,它实际上会丢失信息。
就个人而言,我以“美国/纽约”的形式分别存储重要的日期的原始时区。如果有人有更好的解决方案-欢迎。
在 Postgres 中,即使您将日期时间值存储在具有时区数据类型的时间戳中,原始输入时区也会丢失。
缺点:
假设我有日期时间数据(以及时区信息),说明人们何时在世界各地使用他们的 Facebook 应用程序。现在我将这些值存储在时区数据类型的时间戳中。随机一天,我想看看人们在早上与晚上相比使用他们的 FB 应用程序的频率有多大,以及是否在不同国家/地区看到了相同的趋势。但是等等,我不再有时区信息。坐在华盛顿特区,我可以看到美国东部标准时间上午 10 点,这项活动如何席卷全球。
优点:
如果您正在比较两个具有相同时区时间戳的数据源,但其中一个存储为本地手表显示的内容,而另一个则通过将其转换为 UTC 来存储。在这里,您可以做的只是将时间戳存储在 timestamptz 数据类型中并告诉它属于哪个时区,然后您可以轻松地比较它们。
例如,
PST 时区的活动记录在2014-10-19 10:23:54
. 现在两个独立的数据源分别存储它。Datasource1 将其存储为2004-10-19 10:23:54 PST
,Datasource2 将其存储为2014-10-19 18:23:54 UTC
。如果它们存储在timestamptz数据类型中,它将在您执行时显示相同的时间
SELECT datasource1.time, datasource2.time
由于 timestampz 是在 ZULU/GMT 时间的瞬间记录的,它永远不会改变它的偏移量(因为它是参考),所以没有必要记录时区。您只需在过去、现在或未来将偏移量添加/减去 GEOPOLITICAL 时区偏移量。
您确实需要知道当时适用于过去和现在的时间所在位置的确切地理政治时区。
对于时间目的的未来实例,这可能会变得更加成问题。它应该仍然有效。想想日落。如果某个位置地球有日落@午夜 ZULU 时间(北半球冬季在大西洋或加拿大北部到阿拉斯加的某个地方),并且该时间假定为该位置的晚上 8 点(-4:00 偏移)当您将其记录在系统中并将其记录为“未来的冬季日期晚上 8:00”时,它将在数据库中记录为格林威治标准时间 24:00。
现在,地球上的那个位置在地理相关的时间推算中得到了它的* ss和大拇指它的鼻子,并称他们的时区 - '+11:55'。因此,对于他们来说,当英格兰的午夜(格林威治标准时间午夜)时,他们希望将其称为上午 11:55,这完全是他们的选择。当任何计算机想要显示该位置(即地缘政治时区)的未来日期时,即使太阳正在落山,它们也会将其称为上午 11:55。当然,这将是您计划的那一天 :-) 他们的问题。