Eu gostaria de adicionar (ou melhor, subtrair) um número de dias de um timestamp.
Por exemplo de 2020-04-13 00:00:00 Europe/Berlin
quero subtrair 20 dias e espero que o resultado seja 2020-03-24 00:00:00 Europe/Berlin
.
Se eu correr
select ('2020-04-13 00:00:00 Europe/Berlin'::timestamptz - INTERVAL '20 DAY') AT TIME ZONE 'Europe/Berlin'
eu consigo 2020-03-23 23:00:00.000000
.
Isso parece ser porque o PostgreSQL subtrai 20 * 24 horas (uma mudança de horário de verão ocorre durante esse intervalo de datas), o que é diferente de subtrair 20 dias .
O cálculo do intervalo é feito em qualquer fuso horário para o qual sua sessão esteja definida. Isso está documentado aqui :
Eu não sei qual é o fuso horário da sua sessão (você pode fazer
show timezone;
para ver), mas aparentemente não é 'Europe/Berlin'. Quando definido como 'Europe/Berlin', recebo a resposta que você esperava. Qualquer que seja o fuso horário da sua sessão definido, não faz DST ou não implementa a transição durante o período em questão. Tudo se seus dias durante este período são realmente 24 horas.