postgres:生成一系列尊重时区的时间戳

pst*_*ton 5 postgresql

关于时区从夏令时更改为非夏令时的棘手问题,我感到困惑。

我正在尝试生成一系列时间戳,相隔6小时。稍后将其与数据集中具有每天00、06、12、18小时的相应时间戳的数据合并。

使用以下命令可以正常工作:

generate_series(extract(epoch from start_ts)::integer, extract(epoch from end_ts)::integer, 21600)

其中start_ts是第一个日期的00小时,而end_ts是最后一个日期的00小时(不包括)。

但是,当时区偏移量在系列的一半时从+11变为+10时,它将不再与任何记录匹配,因为系列元素变为1小时。

有没有人有关于如何在尊重时区偏移的情况下如何生成与“ 00,06,12,18 hr timestamps”匹配的“ epoch integers”或时间戳的建议?

Zig*_*ter 2

这将从今天开始生成它(使用 PostgreSQL 9.5+),持续 10 天:

select (current_date::timestamp + ((a-1)||' days')::interval)::timestamptz
from generate_series(1, 10, .25) a
Run Code Online (Sandbox Code Playgroud)

测试一整年:

select *, date_part('hour', d::timestamp), d::timestamp
from (
  select (current_date::timestamp + ((a-1)||' days')::interval)::timestamptz AS d
  from generate_series(1, 365, .25) a
  ) x
where date_part('hour', d) not in (0, 6, 12, 18)
Run Code Online (Sandbox Code Playgroud)

编辑:以下版本适用于 9.5 之前的 PostgreSQL 版本:

select (current_date::timestamp + (((a-1)/4.0)||' days')::interval)::timestamptz
from generate_series(1, 4*  10  ) a  -- 10 days
Run Code Online (Sandbox Code Playgroud)