Postgres имеет несколько типов временных меток:
временная метка без часового пояса - (предпочтительно для хранения временных меток UTC) Вы найдете ее в хранилище многонациональной базы данных. В этом случае клиент позаботится о смещении часового пояса для каждой страны.
метка времени с часовым поясом - смещение часового пояса уже включено в метку времени.
В некоторых случаях ваша база данных не использует часовой пояс, но вам все равно нужно сгруппировать записи по местному часовому поясу и летнему времени (например, https://www.timeanddate.com/time/zone/romania/bucharest )
Чтобы добавить часовой пояс, вы можете использовать этот пример и заменить смещение часового пояса своим.
"your_date_column" at time zone '+03'
Чтобы добавить +1 летнее время, специфичное для летнего времени, вам нужно проверить, попадает ли ваша метка времени в летнее летнее время. Поскольку эти интервалы варьируются в зависимости от 1 или 2 дней, я буду использовать примерное приближение, которое не влияет на записи на конец месяца, поэтому в этом случае я могу игнорировать точный интервал каждого года.
Если необходимо построить более точный запрос, вам нужно добавить условия для создания большего количества случаев. Но примерно, это будет хорошо работать при разделении данных за месяц относительно часового пояса и SummerTime, когда вы найдете временную метку без часового пояса в вашей базе данных:
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)