Sql 带时区的Postgres时间戳转换

Sql 带时区的Postgres时间戳转换,sql,postgresql,datetime,timezone,Sql,Postgresql,Datetime,Timezone,我试图用我在互联网上找到的这个查询来转换时区,但很难理解它 基本上,我想从源文件中读取一个日期字符串,并将其存储在该用户时区的数据库中。数据库列为时间时间戳,没有时区。 假设已知用户的时区为'America/Chicago',源文件时间戳为'2018-06-06 05:00:00' 现在,为了将源datetime转换为此时区,我使用了: select (('2018-06-06 05:00:00'::timestamp AT TIME ZONE 'GMT' )

我试图用我在互联网上找到的这个查询来转换时区,但很难理解它

基本上,我想从源文件中读取一个日期字符串,并将其存储在该用户时区的数据库中。数据库列为时间
时间戳,没有时区。

假设已知用户的时区为
'America/Chicago'
,源文件时间戳为
'2018-06-06 05:00:00'

现在,为了将源datetime转换为此时区,我使用了:

select  (('2018-06-06 05:00:00'::timestamp  AT TIME ZONE 'GMT' ) 
              at time zone 'America/Chicago') as t  
但是,这给出了
2018-06-06 00:00:00
,这是不正确的,因为时间被截断了

如果我不将值强制转换为timestamp,它将使用GMT offset
2018-06-06 10:00:00+05:30给出正确的值

select  (('2018-06-06 05:00:00' AT TIME ZONE 'GMT' ) 
              at time zone 'America/Chicago') as t

我不确定如何正确解释这些结果,而且我对时间戳/时区的了解也不太好。有谁能解释一下如何理解这些查询,以及怎样才能简单地获得我必须存储在表中的值
2018-06-06 10:00:00
。时间没有被缩短。格林尼治标准时间上午5点是芝加哥时间午夜

但是,如果你想要上午10:00,那么我认为你的时区倒过来了,你真的想要:

select (('2018-06-06 05:00:00'::timestamp at time zone 'America/Chicago') at time zone 'GMT' ) as t  

这将芝加哥时间从早上5点改为格林尼治标准时间。

代码有效。时间没有被缩短。格林尼治标准时间上午5点是芝加哥时间午夜

但是,如果你想要上午10:00,那么我认为你的时区倒过来了,你真的想要:

select (('2018-06-06 05:00:00'::timestamp at time zone 'America/Chicago') at time zone 'GMT' ) as t  
从芝加哥时间凌晨5点到格林尼治标准时间