Postgres'in birkaç tür zaman damgası vardır:
saat dilimi olmadan zaman damgası - (UTC zaman damgalarını saklamak tercih edilir) Çok uluslu veritabanı depolama alanında bulabilirsiniz. Bu durumda müşteri, her ülke için saat dilimi dengelemesine bakacaktır.
saat dilimi ile zaman damgası - Zaman dilimi uzaklığı, zaman damgasına zaten dahil edilmiştir.
Bazı durumlarda, veritabanınız saat dilimini kullanmaz, ancak yine de kayıtları yerel saat dilimine ve Yaz Saati uygulamasına göre gruplandırmanız gerekir (örn. Https://www.timeanddate.com/time/zone/romania/bucharest )
Saat dilimi eklemek için bu örneği kullanabilir ve saat dilimi farkını kendinizinkilerle değiştirebilirsiniz.
"your_date_column" at time zone '+03'
DST'ye özgü +1 Yaz Saati ofsetini eklemek için zaman damganızın Yaz DST'sine girip girmediğini kontrol etmeniz gerekir. Bu aralıklar 1 veya 2 güne göre değiştiğinden, ay sonu kayıtlarını etkilemeyen bir yakınlaştırma kullanacağım, bu durumda her yıl tam aralığı görmezden gelebilirim.
Daha kesin bir sorgu oluşturulması gerekiyorsa, daha fazla vaka oluşturmak için koşullar eklemeniz gerekir. Ancak, kabaca, veritabanınızda saat dilimi olmadan zaman damgası bulduğunuzda , aylık olarak saat dilimi ve SummerTime'a göre verileri bölmede iyi çalışır :
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)