我想从时间戳中添加(或更确切地说是减去)天数。
例如,2020-04-13 00:00:00 Europe/Berlin
我想减去 20 天,我希望结果是2020-03-24 00:00:00 Europe/Berlin
.
如果我跑
select ('2020-04-13 00:00:00 Europe/Berlin'::timestamptz - INTERVAL '20 DAY') AT TIME ZONE 'Europe/Berlin'
我明白了2020-03-23 23:00:00.000000
。
这似乎是因为 PostgreSQL 减去 20 * 24 hours (在该日期范围内发生 DST 切换),这与减去 20 days不同。
间隔计算在您的会话设置的任何时区完成。这记录在这里:
我不知道您的会话时区设置为(您可以
show timezone;
查看),但显然它不是“欧洲/柏林”。当设置为“欧洲/柏林”时,我得到了您期望的答案。无论您的会话时区设置为什么,都不会执行 DST,或者不会在相关时间段内实现转换。如果它在此期间的日子真的是 24 小时。