असल में क्या आप चाहते हैं:
$ select starts_at AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific' from schedules where id = 40
मैं इस लेख से समाधान के नीचे है, जो सीधे स्वर्ण है मिल गया !!! यह इस गैर-मामूली मुद्दे को स्पष्ट रूप से बताता है, अगर आप pstgrsql TZ प्रबंधन को बेहतर समझना चाहते हैं तो इसे पढ़ लें।
Expressing PostgreSQL timestamps without zones in local time
यहाँ है क्या हो रहा है। सबसे पहले आपको पता होना चाहिए कि 'पीएसटी टाइमज़ोन यूटीसी टाइमज़ोन के पीछे 8 घंटे है, उदाहरण के लिए 1 जनवरी 2014, 4:30 अपराह्न पीएसटी (बुध, 01 जनवरी 2014 16:00:30 -0800) 2 जनवरी 2014, 00:30 के बराबर है एएम यूटीसी (गुरु, 02 जनवरी 2014 00:00:30 +0000)। पीएसटी में 4:00 बजे के बाद किसी भी समय अगले दिन तक फिसल जाता है, जिसे यूटीसी के रूप में व्याख्या किया जाता है।
इसके अलावा, जैसा कि ऊपर वर्णित इरविन ब्रैंडस्टेटर के रूप में, पोस्ट्रेसक्ल में दो प्रकार के टाइमस्टैम्प डेटा प्रकार हैं, एक टाइमज़ोन और बिना किसी के। अपने timestamps एक समयक्षेत्र, तो एक सरल शामिल हैं:
$ select starts_at AT TIME ZONE 'US/Pacific' from schedules where id = 40
काम करेंगे। हालांकि यदि आपका टाइमस्टैम्प समयहीन है, तो ऊपर दिए गए कमांड को निष्पादित करने से काम नहीं होगा, और आपको पहले अपना टाइमज़ोनलेस टाइमस्टैम्प टाइम टाइम के साथ टाइमस्टैम्प में परिवर्तित करना होगा, अर्थात् यूटीसी टाइमज़ोन, और केवल इसे अपने वांछित 'पीएसटी' या 'यूएस/प्रशांत '(जो कुछ डेलाइट सेविंग टाइम मुद्दों के समान हैं। मुझे लगता है कि आपको या तो ठीक होना चाहिए)।
मुझे एक उदाहरण के साथ प्रदर्शित करने दें जहां मैं एक टाइमज़ोनलेस टाइमस्टैम्प बना देता हूं। आइए सुविधा के लिए मान लें कि हमारा स्थानीय टाइमज़ोन वास्तव में 'पीएसटी' है (यदि यह तब नहीं होता है तो यह थोड़ा और जटिल हो जाता है जो इस स्पष्टीकरण के उद्देश्य के लिए अनावश्यक है)।
मेरे पास है कहते हैं:
$ 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"
पिछले टाइमस्टैम्प PostgreSQL में 'पीएसटी' के लिए यूटीसी से timezoneless टाइमस्टैम्प परिवर्तित करने के बारे में सब भ्रम के लिए कारण है। जब हम लिखें:
timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d
हम एक timezoneless टाइमस्टैम्प लेती हैं और उसे 'पीएसटी TZ को बदलने की कोशिश कर रहे हैं (हम परोक्ष रूप से मान लेते हैं कि PostgreSQL समझ जाएगा कि हम इसे एक यूटीसी TZ से टाइमस्टैम्प परिवर्तित करना चाहते हैं, लेकिन postresql है अपनी योजनाएं!)। प्रैक्टिस में, पोस्टग्रेस्क्ल क्या करता है यह टाइमज़ोनलेस टाइमस्टैम्प ('2014-01-2 00:30:00) लेता है और इसका इलाज करता है जैसे कि यह पहले से ही' पीएसटी 'टीजेड टाइमस्टैम्प था (यानी: 2014-01-2 00:30 : 00 -0800) और यूटीसी टाइमज़ोन में परिवर्तित हो जाता है !!! तो यह वास्तव में वापस की बजाय 8 घंटे आगे धक्का देता है! इस प्रकार हम पाते हैं (2014-01-02 08: 30: 00 + 00)।
वैसे भी, यह अंतिम (अप्रचलित) व्यवहार सभी भ्रम का कारण है। यदि आप अधिक व्यापक स्पष्टीकरण चाहते हैं तो आलेख पढ़ें, मुझे वास्तव में परिणाम मिल गए हैं जो इस अंतिम भाग पर थोड़ा अलग हैं, लेकिन सामान्य विचार समान है।
यह सही प्रकार का है - 'पीएसटी' डेलाइट बचत को ध्यान में नहीं लेता है, "यूएस/प्रशांत" बनाम "पीएसटी" या "पीडीटी" –