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)