जैसा कि आपने पहले ही स्वयं को समझ लिया है, समय क्षेत्र पोस्टग्रेज़ दिनांक / समय प्रकारों के साथ बिल्कुल भी सहेजा नहीं गया है, यहां तक कि timestamptz
. के साथ भी नहीं . इसकी भूमिका क्रमशः एक इनपुट संशोधक या एक आउटपुट डेकोरेटर है। केवल मान (समय में बिंदु) सहेजा जाता है। इस संबंधित उत्तर में पर्याप्त विवरण:
- रेल और पोस्टग्रेएसक्यूएल में टाइमज़ोन को पूरी तरह से नज़रअंदाज़ करना
इसलिए, यदि आप इनपुट स्ट्रिंग के उस हिस्से को संरक्षित करना चाहते हैं, तो आपको इसे स्ट्रिंग से निकालना होगा और इसे स्वयं सहेजना होगा। मैं इस तरह की एक तालिका का उपयोग करूंगा:
CREATE TABLE tstz
...
, ts timestamp -- without time zone
, tz text
)
tz
, होने के नाते text
, एक अंकीय ऑफ़सेट धारण कर सकता है साथ ही एक समय क्षेत्र संक्षिप्त नाम , या एक समय क्षेत्र नाम ।
कठिनाई यह है कि पार्सर द्वारा अनुसरण किए जाने वाले सभी विभिन्न नियमों के अनुसार समय क्षेत्र का हिस्सा निकाला जाए और इस तरह से आसानी से नहीं टूटेगा। अपनी खुद की प्रक्रिया तैयार करने के बजाय, पार्सर से काम करवाएं . इस डेमो पर विचार करें:
WITH ts_literals (tstz) AS (
VALUES ('2013-11-28 23:09:11.761166+03'::text)
,('2013-11-28 23:09:11.761166 CET')
,('2013-11-28 23:09:11.761166 America/New_York')
)
SELECT tstz
,tstz::timestamp AS ts
,right(tstz, -1 * length(tstz::timestamp::text)) AS tz
FROM ts_literals;
एसक्यूएल फिडल.
T
. के साथ या बिना काम करता है दिनांक और समय के बीच। मुख्य तर्क यहाँ है:
right(tstz, -1 * length(tstz::timestamp::text)) AS tz
दिनांक/समय घटक के रूप में पहचाने जाने वाले पार्सर की लंबाई को ट्रिम करने के बाद टाइमस्टैम्प स्ट्रिंग के बचे हुए हिस्से को लें। यह इनपुट पर निर्भर करता है, जैसा कि आपने बताया:
<ब्लॉकक्वॉट>मान्य ISO8601 स्ट्रिंग्स