得到时区的时间

时间:2018-01-26 15:50:01

标签: sql postgresql timezone

我再次伤到了我的头:

在postgresql上,我想获得给定时区的当地时间。

所以,在格林威治标准时间15:45,我希望16:45 +01:00,但我无法获得良好的回报:

SQL Fiddle

查询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

4 个答案:

答案 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)

The documentation说:

  

要记住的另一个问题是,在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; 将其转换为右偏移量,以便为您指定时区的本地时间。

SQL Fiddle

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