我是PostgreSQL的新手,我想知道是否有直接的方法可以使用函数将表中的时间戳值转换到不同的时区。就我而言,是UTC到EST。
例如,这些是我需要转换为EST的值(不仅仅是一个值,而是表中的所有值)
date
-------------------
2015-10-24 16:38:46
2016-01-19 18:27:00
2016-01-24 16:14:34
2016-02-09 23:05:49
2016-02-11 20:46:26
在伦敦,我们目前领先UTC 1小时。所以,如果我拿你的时区不带时间戳,说它是UTC,我会把它打印成我的本地时区。
richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC');
timezone
------------------------
2015-10-24 17:38:46+01
(1 row)
但是你想要";EST";从回报的价值来看,它似乎在美洲的某个地方。如果你愿意的话,你可以用一个SQL函数来包装这个表达式
richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC') AT TIME ZONE 'EST';
timezone
---------------------
2015-10-24 11:38:46
(1 row)
编辑:如何在查询中进行
SELECT ((stored_timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EST') AS local_timestamp
FROM my_table;
类似执行
SELECT '2015-10-24 16:38:46'::timestamp AT time zone 'EST';
timezone
------------------------
2015-10-24 21:38:46+00
(1 row)
我通常将所有内容都保留在UTC中,并在显示时进行转换。我使用类似的东西
SELECT my_date_utc AT time zone 'utc' at time zone 'est' From ....
如果您在访问区域时遇到问题,您也可以简单地通过区域间隔。将时间戳从IST转换为UTC。
SELECT '2020-12-14 06:38:46'::timestamp AT time zone INTERVAL '+05:30';
timezone
------------------------
2015-10-24 11:38:46+00
(1 row)
将时间戳从UTC转换为IST。
SELECT '2020-12-14 06:38:46'::timestamp AT time zone INTERVAL '-05:30';
timezone
------------------------
2020-12-14 12:08:46+00
(1 row)
洛杉矶现在是12:22。我发现我必须反转UST
和america/los_angeles
参数:
ods=> SELECT NOW(),(NOW() AT TIME ZONE 'america/los_angeles') AT TIME ZONE 'utc';;
now | timezone
-------------------------------+-------------------------------
2022-04-22 19:22:35.943605+00 | 2022-04-22 12:22:35.943605+00
(1 row)
我是不是错过了什么?
建立在@Leandro Castro的答案之上。。。
要获取时区中的当前时间,请使用CURRENT_TIME
函数:
SELECT CURRENT_TIME(0) AT time zone 'utc' at time zone 'est';
您应该始终以UTC存储日期的主引用,并在查询中将其转换为时区,或者将数据的特定时区版本存储在另一列中。这样做的原因是,只要您知道存储日期的时区是UTC,就可以快速轻松地将日期从UTC转换为另一个时区。它不需要猜测。或者,你可以将日期与时区一起存储。
如果您有一个用服务器的系统时钟自动填充日期的操作,那么您可以A: 将操作更改为使用UTC时间B: 将服务器上的系统时钟更改为UTC
我遇到了同样的问题,我使用不同的地区和时区,我只需要在查询中修复时区,这样它就不会影响该地区的其他客户,而且我没有更改表结构或任何东西(开放-关闭原则)。我在询问中做了什么:选择TO_CHAR("澳大利亚/墨尔本"时区的current_timestamp,"DD/MM/YYYY hh24:mi AM")作为date_of_extract这对我很有效,我可以将postgressql的"UTC"取消时区更改为"澳大利亚/墨尔本"(您正在查看的任何时区)。希望这会有所帮助。