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
相关产品推荐
相关产品推荐

