O Postgres possui alguns tipos de carimbos de data / hora:
registro de data e hora sem fuso horário - (Preferível para armazenar registros de data e hora UTC) Você encontra-o no armazenamento de banco de dados multinacional. O cliente, nesse caso, cuidará do deslocamento do fuso horário para cada país.
registro de data e hora com fuso horário - O deslocamento do fuso horário já está incluído no registro de data e hora.
Em alguns casos, seu banco de dados não usa o fuso horário, mas você ainda precisa agrupar registros em relação ao fuso horário local e ao horário de verão (por exemplo, https://www.timeanddate.com/time/zone/romania/bucharest )
Para adicionar fuso horário, você pode usar este exemplo e substituir o deslocamento do fuso horário pelo seu.
"your_date_column" at time zone '+03'
Para adicionar o deslocamento +1 no horário de verão específico para o horário de verão, você precisa verificar se o carimbo de data / hora se enquadra no horário de verão. Como esses intervalos variam de 1 a 2 dias, usarei uma aproximação que não afeta os registros do final do mês, portanto, neste caso, posso ignorar o intervalo exato de cada ano.
Se for necessário criar uma consulta mais precisa, você precisará adicionar condições para criar mais casos. Mas, grosso modo, isso funcionará bem na divisão de dados por mês em relação ao fuso horário e ao SummerTime quando você encontrar o carimbo de data e hora sem fuso horário no banco de dados:
SELECT
"id", "Product", "Sale",
date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END) as "date"
FROM
public."Table" AS t
WHERE 1=1
AND t."date" >= '01/07/2015 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
AND t."date" < '01/07/2017 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
GROUP BY date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END)