Sql 在Postgres中组合日期和UTC时间字段

Sql 在Postgres中组合日期和UTC时间字段,sql,postgresql,Sql,Postgresql,我有两个单独的日期和时间字段。时间字段存储在UTC时间中。如何将2合并到datetime字段和本地时间 例如: date: 2021-03-08 time in UTC: 23:00 time zone: GMT+8 我想在当地时间2021-03-08 07:00获得 甚至2021-03-07 23:00UTC 注意:很遗憾,组合字段不是一个选项。由于时差为8小时,请尝试 SELECT '2021-03-08'::date + ('23:00'::time + '8 hours'::inter

我有两个单独的日期和时间字段。时间字段存储在UTC时间中。如何将2合并到datetime字段和本地时间

例如:

date: 2021-03-08
time in UTC: 23:00
time zone: GMT+8
我想在当地时间2021-03-08 07:00获得

甚至
2021-03-07 23:00
UTC


注意:很遗憾,组合字段不是一个选项。

由于时差为8小时,请尝试

SELECT '2021-03-08'::date + ('23:00'::time + '8 hours'::interval);
如果您希望此功能适用于任意时区,则查询会变得更复杂:

SELECT '2021-03-08'::date
     + ((current_date + '23:00'::time)
        AT TIME ZONE 'UTC'
        AT TIME ZONE 'Asia/Ulaanbaatar'
       )::time;

需要知道要转换的时区。要将utc转换为美国/洛杉矶时区:

select '2021-03-08 23:00'::timestamp at time zone 'UTC' at time zone 'america/los_angeles'
select created_at at time zone 'utc' at time zone 'pst'
from users;
您可以查看以下代码:

如果时间戳没有时区列,并且将时间戳存储为UTC,则需要告诉PostgreSQL,然后告诉它将其转换为本地时区

select created_at at time zone 'utc' at time zone 'america/los_angeles'
from users;
为了更简洁,您还可以使用时区的缩写:

select '2021-03-08 23:00'::timestamp at time zone 'UTC' at time zone 'america/los_angeles'
select created_at at time zone 'utc' at time zone 'pst'
from users;
要查看PostgreSQL支持的时区列表,请执行以下操作:


从pg_时区_名称中选择*

选择'2021-03-08':日期+23:00':时间;2021-03-08 23:00:00
Thank you@AdrianKlaver,但时间存储在UTC中。在本例中,日期时间应为
2021-03-07 23:00
2021-03-08 07:00
我不确定是否遵循。在我看来,把
2021-03-08 23:00
=
2021-03-07 23:00
设置为“任意”。@adriankaver本地时区为GMT+08@Abelisto,即产生(给定时区='+8')
2021-03-08 23:00:00
,这不是@HalahAb想要的,这是
2021-03-07 23:00
2021-03-08 07:00
,除非你使用一些武断的标准和可疑的数学,否则这是不可能的。谢谢,这确实解决了问题,但如果使用其他时区,问题会变得复杂。