Postgres时间戳转换与时区

时间:2018-06-17 12:24:21

标签: sql postgresql datetime timezone

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

基本上,我想从源文件中读取日期字符串,并将其存储在该用户时区的数据库中。数据库列的时间为timestamp without time zone.

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

现在要将源日期时间转换为此时区,我使用了:

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,这是不正确的,因为时间被截断了。

如果我没有将值转换为时间戳,则它会使用GMT偏移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值的正确方法,我必须将其存储在表中吗?

1 个答案:

答案 0 :(得分:2)

代码有效。时间不会被截断。格林威治标准时间凌晨5点是芝加哥时间午夜。

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

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

芝加哥时间凌晨5点到格林尼治标准时间。