Postgres มีการประทับเวลาบางประเภท:
timestamp ที่ไม่มีเขตเวลา - (ดีกว่าเพื่อเก็บ UTC timestamps) คุณพบมันในที่จัดเก็บฐานข้อมูลข้ามชาติ ลูกค้าในกรณีนี้จะดูแลเขตเวลาชดเชยสำหรับแต่ละประเทศ
การประทับเวลาพร้อมเขตเวลา - การชดเชยเวลารวมอยู่ในการประทับเวลาแล้ว
ในบางกรณีฐานข้อมูลของคุณไม่ได้ใช้เขตเวลา แต่คุณยังต้องจัดกลุ่มระเบียนตามเขตเวลาท้องถิ่นและเวลาออมแสง (เช่นhttps://www.timeanddate.com/time/zone/romania/bucharest )
ในการเพิ่มเขตเวลาคุณสามารถใช้ตัวอย่างนี้และแทนที่เขตเวลาชดเชยด้วยของคุณ
"your_date_column" at time zone '+03'
ในการเพิ่มการชดเชยเวลาฤดูร้อน +1 ให้กับ DST คุณต้องตรวจสอบว่าการประทับเวลาของคุณตกอยู่ในฤดูร้อน DST หรือไม่ เนื่องจากช่วงเวลาเหล่านั้นแตกต่างกันไปด้วย 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)