我又疼
头了:在postgresql上,我想获取给定时区的本地时间。
所以,在格林威治标准时间15:45
,我想16:45
+01:00
,但我无法得到好的安威瑟:
SQL 小提琴
查询 1:
select current_timestamp at time zone 'GMT' as time_local_gmt
结果:
| time_local_gmt |
|-----------------------------|
| 2018-01-26T15:45:10.871659Z |
这没关系。
查询 2:
select current_timestamp at time zone '+01:00' as time_local_paris
结果:
| time_local_paris |
|-----------------------------|
| 2018-01-26T14:45:10.871659Z |
这是完全错误的,似乎它是-01:00
而不是+01:00
编辑:在此处查看有效答案:https://stackoverflow.com/a/48707297/5546267
我有用。
select current_timestamp at time zone 'UTC+1';
给了我以下结果。
2018-01-26T17:00:58.773039Z
还有一个时区名称列表。
以下是 PostgreSQL 9.6 文档中有关时区名称的摘录。
视图pg_timezone_names提供由 SET 时区识别的时区名称的列表,以及它们的关联缩写、UTC 偏移量和夏令时状态。
基本上,以下查询将为您提供巴黎的当前时间。
SELECT current_timestamp AT TIME ZONE 'Europe/Paris';
祝你好运!
为了完整起见(即使 @Avi Abrami 的答案应该是您要搜索的(,让我们看一下文档中的日期时间运算符。
可以使用 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 节中描述的任何方式指定时区名称。
文档说:
要记住的另一个问题是,在 POSIX 时区名称中,格林威治以西的位置使用正偏移量。在其他任何地方,PostgreSQL都遵循ISO-8601惯例,即正时区偏移量位于格林威治以东。
我想那是你的问题。
好的,终于找到了方法!
SELECT
current_timestamp
AT TIME ZONE 'GMT'
AT TIME ZONE '+01:00'
AS time_local_paris_right;
默认情况下,时间戳为不带 TZ 的 UTC,您强制将其作为 GMT,然后第二个AT
使用正确的偏移量进行转换,以提供指定时区的本地时间。
SQL 小提琴
PostgreSQL 9.6 Schema Setup:
查询 2:
select current_timestamp at time zone 'GMT' as time_local_gmt
结果:
| time_local_gmt |
|-----------------------------|
| 2018-02-09T13:44:56.824107Z |
查询 3:
select current_timestamp at time zone '+01:00' as time_local_paris_wrong
结果:
| time_local_paris_wrong |
|-----------------------------|
| 2018-02-09T12:44:56.824107Z |
查询 4:
select current_timestamp at time zone 'GMT' at time zone '+01:00' as time_local_paris_right
结果:
| time_local_paris_right |
|-----------------------------|
| 2018-02-09T14:44:56.824107Z |