You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中能否生成考虑时区变更的时间戳序列?

问题背景

根据IANA时区规则,America/Chicago时区在1920-10-31 02:00:00存在夏令时变更(时间回拨1小时)。但PostgreSQL生成时间戳序列时,默认不会自动遵循该规则(所有测试基于PostgreSQL 9.6版本)。

基础测试验证规则有效性

单独执行时间计算时,PostgreSQL能正确反映IANA的夏令时规则:

select 
timestamptz '1920-10-31 01:00:00 America/Chicago',
timestamptz '1920-10-30 01:00:00 America/Chicago' + interval '24 hours'

执行结果显示,第二个时间戳因夏令时回拨,比单纯累加24小时少了1小时,符合预期规则。

序列生成测试(未符合预期)

将时间累加逻辑扩展到序列生成场景时,以下三种方式均未体现夏令时导致的时间缺失:

1. 使用generate_series

select * from generate_series(timestamptz '1920-10-29 01:00:00 America/Chicago', timestamptz '1920-11-02 01:00:00 America/Chicago', interval '24 hours')

2. 使用递归CTE

WITH RECURSIVE timestamp_series AS (
SELECT timestamptz '1920-10-29 01:00:00 America/Chicago' AS generated_timestamp
UNION ALL
SELECT generated_timestamp + interval '24 hours'
FROM timestamp_series
WHERE generated_timestamp + interval '24 hours' <= timestamptz '1920-11-02 01:00:00 America/Chicago'
)
SELECT generated_timestamp FROM timestamp_series;

3. 使用PL/pgSQL函数

CREATE OR REPLACE FUNCTION generate_timestamp_series(
start_timestamp timestamptz,
end_timestamp timestamptz,
timestamp_interval interval
)
RETURNS SETOF timestamptz AS
$$
DECLARE
loop_timestamp timestamptz := start_timestamp;
BEGIN
WHILE loop_timestamp <= end_timestamp LOOP
RETURN NEXT loop_timestamp;
loop_timestamp := loop_timestamp + timestamp_interval;
END LOOP;

RETURN;
END;
$$
LANGUAGE plpgsql;

SELECT * FROM generate_timestamp_series(
timestamptz '1920-10-29 01:00:00 America/Chicago',
timestamptz '1920-11-02 01:00:00 America/Chicago',
interval '1 day'
);

提问

能否在PostgreSQL中生成考虑时区变更(如夏令时切换)的时间戳序列?


内容的提问来源于stack exchange,提问作者S Strong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:37:33