आपने जोर दिया कि:
तो आप कभी नहीं एक ही पंक्ति के भीतर एक तिथि रेखा को पार करें। मेरा सुझाव है कि आप 1x तारीख
को सेव कर लें 3x समय
और समय क्षेत्र (पाठ
. के रूप में या FK कॉलम):
CREATE TABLE legacy_table (
event_id bigint PRIMARY KEY NOT NULL
, report_date date NOT NULL
, start_hour time
, end_hour time
, expected_hour time
, tz text -- time zone
);
जैसा कि आप पहले ही पा चुके हैं, timetz
(समय क्षेत्र के साथ समय
) आम तौर से बचा जाना चाहिए
. यह डीएसटी नियमों के साथ ठीक से व्यवहार नहीं कर सकता (d aylight s एविंग टी आईएमई)।
तो मूल रूप से जो आपके पास पहले से था . बस दिनांक घटक को start_hour
. से छोड़ दें , वह मृत भाड़ा है। कास्ट करें टाइमस्टैम्प
समय
. तक तारीख काटने के लिए। जैसे:(टाइमस्टैम्प '2018-03-25 1:00:00')::time
टीजेड
AT द्वारा स्वीकृत कोई भी स्ट्रिंग हो सकती है समय क्षेत्र
निर्माण, लेकिन अलग-अलग समय क्षेत्रों से मज़बूती से निपटने के लिए, समय क्षेत्र के नामों का विशेष रूप से उपयोग करना सबसे अच्छा है। कोई भी नाम
आपको सिस्टम कैटलॉग pg_timezone_names
।
भंडारण को अनुकूलित करने के लिए, आप एक छोटी लुकअप तालिका में अनुमत समय क्षेत्र के नाम एकत्र कर सकते हैं और tz टेक्स्ट
. को प्रतिस्थापित कर सकते हैं tz_id int संदर्भ my_tz_table
. के साथ ।
DST के साथ और बिना दो उदाहरण पंक्तियाँ:
INSERT INTO legacy_table VALUES
(1, '2018-03-25', '1:00', '3:00', '2:00', 'Europe/Vienna') -- sadly, with DST
, (2, '2018-03-25', '1:00', '3:00', '2:00', 'Europe/Moscow'); -- Russians got rid of DST
प्रतिनिधित्व उद्देश्यों या गणनाओं के लिए आप निम्न चीज़ें कर सकते हैं:
SELECT (report_date + start_hour) AT TIME ZONE tz AT TIME ZONE 'UTC' AS start_utc
, (report_date + end_hour) AT TIME ZONE tz AT TIME ZONE 'UTC' AS end_utc
, (report_date + expected_hour) AT TIME ZONE tz AT TIME ZONE 'UTC' AS expected_utc
-- START_HOUR - END_HOUR
, (report_date + start_hour) AT TIME ZONE tz
- (report_date + end_hour) AT TIME ZONE tz AS start_minus_end
FROM legacy_table;
आप एक या अधिक दृश्य बना सकते हैं आवश्यकतानुसार स्ट्रिंग्स को आसानी से प्रदर्शित करने के लिए। तालिका आपकी आवश्यकता . जानकारी संग्रहीत करने के लिए है ।
कोष्ठक पर ध्यान दें! वरना ऑपरेटर +
AT TIME ZONE
. से पहले आबद्ध होगा ऑपरेटर वरीयता
के कारण ।
और परिणाम देखें:
db<>fiddle यहां
चूंकि वियना में समय के साथ हेराफेरी की जाती है (जैसे कोई भी जगह जहां मूर्खतापूर्ण डीएसटी नियम लागू होते हैं), आपको "आश्चर्यजनक" परिणाम मिलते हैं।
संबंधित:
- पोस्टग्रेज में डीएसटी के लिए लेखांकन, अनुसूचित वस्तुओं का चयन करते समय
- समय की अनदेखी ज़ोन पूरी तरह से रेल और पोस्टग्रेएसक्यूएल में