我再次伤到了我的头:
在postgresql上,我想获得给定时区的当地时间。
所以,在格林威治标准时间15:45
,我希望16:45
+01:00
,但我无法获得良好的回报:
查询1 :
select current_timestamp at time zone 'GMT' as time_local_gmt
Results :
| time_local_gmt |
|-----------------------------|
| 2018-01-26T15:45:10.871659Z |
没关系。
查询2 :
select current_timestamp at time zone '+01:00' as time_local_paris
Results :
| time_local_paris |
|-----------------------------|
| 2018-01-26T14:45:10.871659Z |
这是完全错误的,似乎是-01:00
而不是+01:00
答案 0 :(得分:2)
这对我有用。
select current_timestamp at time zone 'UTC+1';
给我以下结果。
2018-01-26T17:00:58.773039Z
还有一个timezone names列表。
以下是PostgreSQL 9.6文档中有关时区名称的摘录。
视图pg_timezone_names提供SET TIMEZONE识别的时区名称列表,以及相关缩写,UTC偏移和夏令时状态。
基本上,以下查询将为您提供巴黎当前时间。
SELECT current_timestamp AT TIME ZONE 'Europe/Paris';
祝你好运!
答案 1 :(得分:1)
为了完整性(即使@Avi Abrami的答案应该是您正在搜索的内容),让我们来看看datetime operators in the docs。
可以使用INTERVAL
关键字为存储值添加小时数:
SELECT current_timestamp AT TIME ZONE INTERVAL '+02:00' AS plus_two;
然后导致
2018-01-26T17:45:10.871659Z
(格林尼治标准时间为2018-01-26T15:45:10.871659Z
时)
第9.9.3 AT_TIME_ZONE节提到我使用INTERVAL
而没有任何先行的运算符:
在这些表达式中,可以将所需的时区区域指定为文本字符串(例如,' PST')或作为间隔(例如, INTERVAL' -08: 00' 强>)。在文本案例中,可以使用第8.5.3节中描述的任何方式指定时区名称。
答案 2 :(得分:1)
要记住的另一个问题是,在POSIX时区名称中,正偏移用于格林威治的 west 位置。在其他地方,PostgreSQL遵循ISO-8601惯例,即格林威治的正时区偏移 east 。
我猜这是你的问题。
答案 3 :(得分:0)
@httpX
默认情况下,时间戳为UTC而不是TZ,您将其强制为GMT,然后第二个SELECT
current_timestamp
AT TIME ZONE 'GMT'
AT TIME ZONE '+01:00'
AS time_local_paris_right;
将其转换为右偏移量,以便为您指定时区的本地时间。
PostgreSQL 9.6架构设置:
查询2 :
AT
<强> Results 强>:
select current_timestamp at time zone 'GMT' as time_local_gmt
查询3 :
| time_local_gmt |
|-----------------------------|
| 2018-02-09T13:44:56.824107Z |
<强> Results 强>:
select current_timestamp at time zone '+01:00' as time_local_paris_wrong
查询4 :
| time_local_paris_wrong |
|-----------------------------|
| 2018-02-09T12:44:56.824107Z |
<强> Results 强>:
select current_timestamp at time zone 'GMT' at time zone '+01:00' as time_local_paris_right