Postgres a quelques types d'horodatages:
horodatage sans fuseau horaire - (préférable pour stocker les horodatages UTC) Vous le trouvez dans le stockage de base de données multinational. Le client dans ce cas se chargera du décalage du fuseau horaire pour chaque pays.
horodatage avec fuseau horaire - Le décalage du fuseau horaire est déjà inclus dans l'horodatage.
Dans certains cas, votre base de données n'utilise pas le fuseau horaire, mais vous devez tout de même regrouper les enregistrements en fonction du fuseau horaire local et de l'heure d'été (par exemple https://www.timeanddate.com/time/zone/romania/bucharest )
Pour ajouter un fuseau horaire, vous pouvez utiliser cet exemple et remplacer le décalage du fuseau horaire par le vôtre.
"your_date_column" at time zone '+03'
Pour ajouter le décalage d'heure d'été +1 spécifique à DST, vous devez vérifier si votre horodatage correspond à un DST d'été. Comme ces intervalles varient avec 1 ou 2 jours, j'utiliserai une approximation qui n'affecte pas les enregistrements de fin de mois, donc dans ce cas, je peux ignorer chaque intervalle exact de l'année.
Si une requête plus précise doit être créée, vous devez ajouter des conditions pour créer plus de cas. Mais en gros, cela fonctionnera bien pour diviser les données par mois en fonction du fuseau horaire et de l'heure d'été lorsque vous trouvez un horodatage sans fuseau horaire dans votre base de données:
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)