答案 0 :(得分:14)
我假设您有一个名为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做得非常好。
答案 1 :(得分:8)
“PostgreSQL做得非常好。”
我真的很喜欢PostgreSQL,但是在这个特殊的功能中,它并不是很好。时区不仅抵消了GMT。时区对于暗示夏令时的政治规则是紧迫的。由于有大量时区具有相同的偏移量和不同的夏令时规则 - 当PG忘记原始时区时,它实际上会丢失信息。
我个人将原始时区分别存储在“America / New_York”形式的重要日期。如果有人有更好的解决方案 - 欢迎。
答案 2 :(得分:4)
在Postgres中,即使您将日期时间值存储在带有时区的时间戳数据类型中,原始输入时区也会丢失。
<强>缺点:强>
如果我有人们在世界各地使用他们的Facebook应用程序的日期时间数据(以及时区信息),请说。现在,我将这些值存储在时间戳和时区数据类型中。一个随机的日子,我想看看人们在早上使用他们的FB应用程序与晚上相比有多大,如果在各个国家看到相同的趋势。
但是等等,我不再有时区信息。
坐在D.C.,我能看到的是当它是美国东部时间上午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
答案 3 :(得分:0)
由于时间戳在ZULU / GMT时间内被重新记录,从而不会改变它的偏移(因为它是参考),因此没有必要记录时区。您只需要在PAST,PRESENT或FUTURE中将偏移量加/减到GEOPOLITICAL时区偏移量。
你 DO 需要知道当前适用的地点生效的确切地理临时时区适用于过去和现在的目的。
对于时间目的的未来实例,这可能会产生更多问题。它应该仍然有效。想想日落。如果某个位置地球有一个日落@午夜ZULU时间(在北半球冬季大西洋或北加拿大到阿拉斯加的某个地方),那个时间假定是在该位置的晚上8点(-4:00偏移)当您在系统中记录它并将其记录为“将来的晚上8:00 PM”时,它将在数据库中记录为格林尼治标准时间24:00。
现在,地球上的那个位置在地理相关的时间推算中会抬起它的头发,并称其为时区 - “+11:55”。所以对于他们来说,当他们在英格兰的午夜时(格林尼治标准时间午夜),他们想要在上午11:55打电话给他们,完全是他们的选择。当任何计算机希望将来显示该位置的那个日期(即地缘政治时区)时,即使太阳正在设置,它们也将在上午11:55调用它。当然,它将是你计划它的那一天的前一天:-)他们的问题。