PostgreSQL generate_series出现重复2021-03-28 03:00行的原因咨询
PostgreSQL generate_series 出现重复时间显示的原因
这不是PostgreSQL的Bug,是时区夏令时切换导致的预期行为,具体逻辑如下:
时间类型的底层逻辑
你的查询里,generate_series接收的起始值是date类型,PostgreSQL会自动将其转为timestamp with time zone(简称timestamptz),基于当前服务器/会话的时区计算序列。这类时间戳本质存储的是UTC时间,显示时会转换为本地时区的时间格式。夏令时切换引发的本地时间重复
2021年3月28日是部分时区的夏令时结束节点(比如南美部分时区):当夏令时结束时,当地时钟会回拨1小时,这就导致同一个本地时间会对应两个不同的UTC时间。
举个例子,假设你的服务器时区在3月28日凌晨3点从夏令时切换到冬令时,时钟回拨1小时,那么:- UTC时间
2021-03-28 04:00:00转本地时间是2021-03-28 03:00:00(夏令时规则) - UTC时间
2021-03-28 05:00:00转本地时间还是2021-03-28 03:00:00(冬令时规则)
这两个时间的UTC值完全不同,对应的epoch自然有差异,但转换为本地时间显示时就会出现重复的2021-03-28 03:00:00。
- UTC时间
验证差异的方法
你可以执行以下查询,查看UTC时间和epoch值的差异:select date_hour, date_hour at time zone 'UTC' as utc_time, extract(epoch from date_hour) as epoch from generate_series('2021-03-28'::date, '2021-03-29'::date - interval '1 minute', interval '1 hour') as date_hour;结果里会清晰看到两个看似重复的本地时间,对应的UTC时间和epoch值完全不同。
内容的提问来源于stack exchange,提问作者c.bear
相关产品推荐
相关产品推荐

