【问题标题】:How to convert timestamp without timezone and integer representing timezone to a new timestamp without timezone in PostgreSQL如何在PostgreSQL中将没有时区的时间戳和表示时区的整数转换为没有时区的新时间戳
【发布时间】:2022-02-02 02:36:59
【问题描述】:
假设我有一个包含两个字段的表:snapshot_date(没有时区的时间戳)和时区(整数),
| snapshot_date |
timezone |
| 2021-01-12 08:00:00 |
-3 |
| 2021-01-12 00:00:00 |
-5 |
我需要从这个表中提取本地时间,我尝试使用(EXTRACT (hour from timestamp))::integer + timezone,这适用于第一行,给出5 的小时结果,但第二行你得到-5,应该实际上是19,因为用时区调整的相应日期是2021-01-11 19:00:00。所以我想要做的是计算一个新的快照日期调整时区,这样我就可以正确提取小时后。
【问题讨论】:
标签:
sql
postgresql
date
timestamp
timezone
【解决方案1】:
您需要先将小时数添加到时间戳中,然后提取小时数:
extract(hour from snapshot_date + make_interval(hours => timezone))
【解决方案2】:
设法获得预期的结果:
extract(hour from snapshot_date + interval '1 hour' * timezone)
【解决方案3】:
类似:
show timezone; US/Pacific
select ('2021-01-12 08:00:00'::timestamp::text || (-3)::text)::timestamptz;
2021-01-12 03:00:00-08
select extract(hour from('2021-01-12 08:00:00'::timestamp::text || (-3)::text)::timestamptz);
3