Postgres memiliki beberapa jenis cap waktu:
timestamp tanpa zona waktu - (Lebih disukai menyimpan cap waktu UTC) Anda menemukannya di penyimpanan basis data multinasional. Klien dalam hal ini akan menangani penggantian zona waktu untuk masing-masing negara.
timestamp dengan zona waktu - Offset zona waktu sudah termasuk dalam timestamp.
Dalam beberapa kasus, basis data Anda tidak menggunakan zona waktu tetapi Anda masih perlu mengelompokkan catatan sehubungan dengan zona waktu lokal dan Waktu Musim Panas (mis. Https://www.timeanddate.com/time/zone/romania/bucharest )
Untuk menambahkan zona waktu, Anda dapat menggunakan contoh ini dan mengganti zona waktu dengan milik Anda.
"your_date_column" at time zone '+03'
Untuk menambahkan +1 Waktu Musim Panas khusus untuk DST Anda perlu memeriksa apakah cap waktu Anda jatuh ke dalam Summer DST. Karena interval tersebut bervariasi dengan 1 atau 2 hari, saya akan menggunakan aproximation yang tidak mempengaruhi catatan akhir bulan, jadi dalam hal ini saya dapat mengabaikan interval tepat setiap tahun.
Jika kueri yang lebih tepat harus dibuat, maka Anda harus menambahkan kondisi untuk membuat lebih banyak kasus. Namun secara kasar, ini akan berfungsi dengan baik dalam membagi data per bulan sehubungan dengan zona waktu dan SummerTime ketika Anda menemukan cap waktu tanpa zona waktu di basis data Anda:
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)