Postgres में टाइमस्टैम्प के कुछ प्रकार हैं:
टाइमज़ोन के बिना टाइमस्टैम्प - (UTC टाइमस्टैम्प को स्टोर करने के लिए उपयुक्त) आप इसे बहुराष्ट्रीय डेटाबेस भंडारण में पाते हैं। इस मामले में ग्राहक प्रत्येक देश के लिए टाइमजोन ऑफसेट का ध्यान रखेगा।
टाइमज़ोन के साथ टाइमस्टैम्प - टाइमज़ोन ऑफसेट को टाइमस्टैम्प में पहले से ही शामिल किया गया है।
कुछ मामलों में, आपका डेटाबेस टाइमज़ोन का उपयोग नहीं करता है, लेकिन फिर भी आपको स्थानीय टाइमज़ोन और डेलाइट सेविंग टाइम (उदाहरण https://www.timeanddate.com/time/zone/romania/bucharest ) के संबंध में समूह रिकॉर्ड करने की आवश्यकता है
टाइमज़ोन जोड़ने के लिए आप इस उदाहरण का उपयोग कर सकते हैं और टाइमज़ोन ऑफसेट को अपने साथ बदल सकते हैं।
"your_date_column" at time zone '+03'
डीएसटी के लिए विशिष्ट +1 समर टाइम ऑफसेट को जोड़ने के लिए आपको यह जांचना होगा कि आपका टाइमस्टैम्प समर डीएसटी में आता है या नहीं। जैसा कि उन अंतरालों में 1 या 2 दिन का अंतर होता है, मैं एक औचित्य का उपयोग करूंगा जो महीने के रिकॉर्ड के अंत को प्रभावित नहीं करता है, इसलिए इस मामले में मैं प्रत्येक वर्ष के सटीक अंतराल को अनदेखा कर सकता हूं।
यदि अधिक सटीक क्वेरी का निर्माण करना है, तो आपको अधिक मामले बनाने के लिए शर्तों को जोड़ना होगा। लेकिन मोटे तौर पर, यह समय-सारणी और समरटाइम के संबंध में प्रति माह डेटा को विभाजित करने में ठीक काम करेगा जब आप अपने डेटाबेस में टाइमज़ोन के बिना टाइमस्टैम्प पाते हैं:
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)