मूल रूप से आप जो चाहते हैं वह है:
$ select starts_at AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific' from schedules where id = 40
मुझे इस लेख से समाधान मिला है जो नीचे है, जो सीधे सोना है !!! यह इस गैर-तुच्छ मुद्दे को बहुत स्पष्ट रूप से समझाता है, अगर आप pstgrsql TZ प्रबंधन को बेहतर ढंग से समझना चाहते हैं तो इसे पढ़ें।
स्थानीय समय में ज़ोन के बिना PostgreSQL टाइमस्टैम्प व्यक्त करना
यहाँ क्या हो रहा है। सबसे पहले आपको पता होना चाहिए कि 'पीएसटी टाइमज़ोन यूटीसी टाइमज़ोन से 8 घंटे पीछे है, उदाहरण के लिए 1 जनवरी 2014, शाम 4:30 बजे पीएसटी (बुध, 01 जनवरी 2014 16:00:30 -0800) 2 जनवरी 2014, 00:30 के बराबर है। AM UTC (गुरु, 02 जनवरी 2014 00:00:30 +0000)। पीएसटी में शाम 4:00 बजे के बाद किसी भी समय अगले दिन पर फिसल जाता है, जिसे यूटीसी के रूप में व्याख्यायित किया जाता है।
साथ ही, जैसा कि इरविन ब्रैंडस्टेटर ने ऊपर उल्लेख किया है, पोस्टरेस्क्ल में दो प्रकार के टाइमस्टैम्प डेटा प्रकार हैं, एक टाइमज़ोन के साथ और एक बिना। यदि आपके टाइमस्टैम्प में टाइमज़ोन शामिल है, तो एक सरल:
$ select starts_at AT TIME ZONE 'US/Pacific' from schedules where id = 40
काम करेगा। हालाँकि यदि आपका टाइमस्टैम्प टाइमज़ोनलेस है, तो उपरोक्त कमांड को निष्पादित करने से काम नहीं चलेगा, और आपको सबसे पहले अपने टाइमज़ोनलेस टाइमस्टैम्प को टाइमज़ोन के साथ टाइमज़ोन में बदलना होगा, अर्थात् यूटीसी टाइमज़ोन, और केवल तभी इसे अपने वांछित 'पीएसटी' या 'यूएस/ Pacific' (जो कुछ डेलाइट सेविंग टाइम इश्यू तक समान हैं। मुझे लगता है कि आपको इनमें से किसी के साथ ठीक होना चाहिए)।
मैं एक उदाहरण के साथ प्रदर्शित करता हूं जहां मैं टाइमज़ोन रहित टाइमस्टैम्प बनाता हूं। आइए सुविधा के लिए मान लें कि हमारा स्थानीय समय क्षेत्र वास्तव में 'पीएसटी' है (यदि ऐसा नहीं होता तो यह थोड़ा और जटिल हो जाता है जो इस स्पष्टीकरण के उद्देश्य के लिए अनावश्यक है)।
कहो मेरे पास है:
$ select timestamp '2014-01-2 00:30:00' AS a, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'UTC' AS b, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'UTC' AT TIME ZONE 'PST' AS c, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d
यह मिलेगा:
"a"=>"2014-01-02 00:30:00" (This is the timezoneless timestamp)
"b"=>"2014-01-02 00:30:00+00" (This is the UTC TZ timestamp, note that up to a timezone, it is equivalent to the timezoneless one)
"c"=>"2014-01-01 16:30:00" (This is the correct 'PST' TZ conversion of the UTC timezone, if you read the documentation postgresql will not print the actual TZ for this conversion)
"d"=>"2014-01-02 08:30:00+00"
अंतिम टाइमस्टैम्प पोस्टग्रेस्क्ल में यूटीसी से 'पीएसटी' के लिए टाइमज़ोनलेस टाइमस्टैम्प को परिवर्तित करने के बारे में सभी भ्रम का कारण है। जब हम लिखते हैं:
timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d
हम एक टाइमज़ोनलेस टाइमस्टैम्प ले रहे हैं और इसे 'PST TZ' में बदलने की कोशिश कर रहे हैं (हम परोक्ष रूप से यह मानते हैं कि पोस्टग्रेस्क्ल समझ जाएगा कि हम चाहते हैं कि यह टाइमस्टैम्प को UTC TZ से बदल दे, लेकिन postresql की अपनी योजनाएँ हैं!) व्यवहार में, postgresql जो करता है वह टाइमज़ोनलेस टाइमस्टैम्प ('2014-01-2 00:30:00) लेता है और इसे ऐसे मानता है जैसे यह पहले से ही 'PST' TZ टाइमस्टैम्प था (यानी:2014-01-2 00:30) :00 -0800) और उसे यूटीसी टाइमज़ोन में कनवर्ट करता है !!! तो यह वास्तव में इसे पीछे की बजाय 8 घंटे आगे बढ़ाता है! इस प्रकार हमें (2014-01-02 08:30:00+00) मिलता है।
वैसे भी, यह अंतिम (अन-सहज) व्यवहार सभी भ्रम का कारण है। लेख पढ़ें यदि आप अधिक गहन स्पष्टीकरण चाहते हैं, तो मुझे वास्तव में परिणाम मिले हैं जो इस अंतिम भाग पर थोड़े अलग हैं, लेकिन सामान्य विचार समान है।