Postgresql Postgres sql时区

Postgresql Postgres sql时区,postgresql,Postgresql,我尝试返回特定时区的值,但我遇到了一些奇怪的行为: SELECT created_at AT TIME ZONE 'US/Pacific' - created_at, NOW() AT TIME ZONE 'US/Pacific' - NOW(), NOW() now FROM "my_table" ORDER by id DESC LIMIT 1 返回 10:00:00 | -10:00:00 | 2017-08-02 17:36:30.660477+03

我尝试返回特定时区的值,但我遇到了一些奇怪的行为:

SELECT created_at AT TIME ZONE 'US/Pacific' - created_at,
       NOW() AT TIME ZONE 'US/Pacific' - NOW(),
       NOW() now  FROM "my_table" 
ORDER by id DESC LIMIT 1
返回

10:00:00 | -10:00:00 | 2017-08-02 17:36:30.660477+03
为什么同一个函数为表中的列和动态时间返回相反的值(-10/+10)


谢谢

类型
不带时区的时间戳
被解释为“本地时区”。
因此,您在时区“US/Pacific”创建的
值将作为给定时区的时间戳

虽然
NOW()
返回带有时区的
时间戳
,因此时区“US/Pacific”的
NOW()值必须转换为不同的时区

见文件:

编辑 试试这个:

SELECT created_at AT TIME ZONE 'US/Pacific' AS crated_at_us_pacific, created_at,
       NOW() AT TIME ZONE 'US/Pacific' AS now_us_pacific, NOW() AS now
   FROM "my_table"
   ORDER by id DESC
   LIMIT 1

感谢宫本美吉的澄清,它让我走上了正轨

如果字段时间戳在时区中没有时区,则定义特定时区。因此,首先声明localtime,然后将其转换为特定时区:因此固定SQL是:

SELECT created_at AT TIME ZONE 'localtime' AT TIME ZONE 'US/Pacific' - created_at,
       NOW() AT TIME ZONE 'US/Pacific' - NOW(),
       NOW() now  FROM "my_table" 
ORDER by id DESC LIMIT 1
编辑

更动态

SELECT created_at::timestamptz AT TIME ZONE 'US/Pacific' - created_at,
       NOW() AT TIME ZONE 'US/Pacific' - NOW(),
       NOW() now  FROM "my_table" 
ORDER by id DESC LIMIT 1

首先
timestamtz
将时间转换为本地时区,然后再转换为时区“美国/太平洋”所需的时区

创建的列是什么类型的?
创建的列是没有时区的时间戳,不要在标题中添加“已解决”。如果Usagi的答案解决了您的问题,请接受答案。否则这个问题仍然“悬而未决”。将答案从
SELECT created_at TIME'US/Pacific'时区为…
更改为
SELECT created_at TIME'localtime'时区为…
。在此之后,我将其标记为有用
SELECT
语句的目的是显示值不同的原因,而不是给出如何解决的建议,因为您的问题是“为什么”。。。