Postgres tiene pocos tipos de marcas de tiempo:
marca de tiempo sin zona horaria - (Preferible para almacenar marcas de tiempo UTC) Lo encuentra en el almacenamiento de bases de datos multinacionales. El cliente en este caso se encargará de la compensación de zona horaria para cada país.
marca de tiempo con zona horaria: el desplazamiento de la zona horaria ya está incluido en la marca de tiempo.
En algunos casos, su base de datos no utiliza la zona horaria, pero aún necesita agrupar registros con respecto a la zona horaria local y el horario de verano (por ejemplo, https://www.timeanddate.com/time/zone/romania/bucharest )
Para agregar una zona horaria, puede usar este ejemplo y reemplazar el desplazamiento de la zona horaria con el suyo.
"your_date_column" at time zone '+03'
Para agregar el desplazamiento de horario de verano +1 específico para el horario de verano, debe verificar si su marca de tiempo cae en un horario de verano. Como esos intervalos varían con 1 o 2 días, usaré una aproximación que no afecta los registros de fin de mes, por lo que en este caso puedo ignorar el intervalo exacto de cada año.
Si se debe generar una consulta más precisa, debe agregar condiciones para crear más casos. Pero más o menos, esto funcionará bien al dividir los datos por mes con respecto a la zona horaria y SummerTime cuando encuentre la marca de tiempo sin zona horaria en su base de datos:
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)