Postgres ha alcuni tipi di timestamp:
timestamp senza fuso orario - (preferibile archiviare timestamp UTC) Lo si trova nella memoria di database multinazionale. Il cliente in questo caso si occuperà dell'offset del fuso orario per ciascun paese.
timestamp con fuso orario - L'offset del fuso orario è già incluso nel timestamp.
In alcuni casi, il database non utilizza il fuso orario ma è comunque necessario raggruppare i record in base al fuso orario locale e all'ora legale (ad es. Https://www.timeanddate.com/time/zone/romania/bucarest )
Per aggiungere il fuso orario è possibile utilizzare questo esempio e sostituire l'offset del fuso orario con il proprio.
"your_date_column" at time zone '+03'
Per aggiungere lo scostamento dell'ora legale +1 specifico all'ora legale è necessario verificare se il timestamp cade in un ora legale estiva. Poiché tali intervalli variano con 1 o 2 giorni, userò un approssimazione che non influisce sui record di fine mese, quindi in questo caso posso ignorare l'intervallo esatto di ogni anno.
Se è necessario creare una query più precisa, è necessario aggiungere condizioni per creare più casi. Ma approssimativamente, questo funzionerà perfettamente nella suddivisione dei dati al mese rispetto al fuso orario e al SummerTime quando trovi il timestamp senza fuso orario nel tuo database:
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)