2012-04-30 8 views
5

में डेलाइट बचत समय के साथ समय क्षेत्र हम अपने स्वयं के स्ट्रीम गेज (इस यूएसजीएस गेज की तरह बहुत कुछ तैनात कर रहे हैं: http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600) इसलिए हम केकर्स जानते हैं कि स्ट्रीम को पैडल करने के लिए पर्याप्त पानी है या नहीं और समय बर्बाद नहीं करते हैं और वहाँ ड्राइव करने के लिए गैस। हम उम्मीद करते हैं कि इनमें से कुछ दक्षिण पूर्व वाइटवाटर क्षेत्र में स्थापित करें जो पूर्वी और केंद्रीय समय क्षेत्र को फैलाता है।पोस्टग्रेएसक्यूएल

मैं रिकॉर्ड के लिए वर्तमान_टाइम के डिफ़ॉल्ट मान का उपयोग कर रिकॉर्ड रिकॉर्ड कर रहा हूं। मैं बाद में MM/DD/YYYY HH12:MI AM TZ प्रारूप का उपयोग कर डेटा प्रदर्शित करना चाहता हूं, जो 03/12/2012 01:00 AM CDT जैसे पढ़ने को आउटपुट करता है। मैं आउटपुट के लिए दिन के प्रकाश बचत समय में बदलावों के बारे में भी जागरूक होना चाहूंगा, इसलिए पिछली वाक्य का अंतिम भाग सीएसटी और सीडीटी के बीच बदल जाएगा जब हम 'वसंत आगे' और 'पतन वापस' करेंगे। यह परिवर्तन इस वर्ष 3/11/2012 को हुआ था और मैंने नीचे इस डीएसटी लाइन के दोनों किनारों पर तिथियां शामिल की हैं। मैं विकास के लिए अपने विंडोज 7 लैपटॉप का उपयोग कर रहा हूं और बाद में हम यूनिक्स बॉक्स पर तैनात होंगे। पोस्टग्रेस ने स्पष्ट रूप से पाया है कि मेरा विंडोज कंप्यूटर पूर्वी यूएस समय क्षेत्र में सेट है। मैं इसे 'टाइम ज़ोन के बिना टाइमस्टैम्प' क्षेत्र और 'टाइम ज़ोन' फ़ील्ड के साथ टाइमस्टैम्प के साथ कोशिश कर रहा हूं लेकिन इसे काम पर नहीं ला सकता।

मैंने अपने चयन में 'समय क्षेत्र' का उपयोग करने का प्रयास किया है और समय-समय पर समय क्षेत्र प्रदर्शित करने के लिए हर चीज काम कर रही है। जब मैं सीडीटी में समय मांगता हूं तो वास्तविक घंटा टाइम स्टैम्प का एक घंटे तक सही ढंग से घटाया जाता है। लेकिन आउटपुट में ईडीटी प्रदर्शित होता है।

SELECT reading_time as raw, 
     reading_time at time zone 'CDT', 
     to_char(reading_time at time zone 'CDT', 
      'MM/DD/YYYY HH12:MI AM TZ') as formatted_time 
    FROM readings2; 

"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT" 
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT" 
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST" 
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST" 
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT" 

मैं समय क्षेत्र संग्रहीत कर रहा हूं कि हमारे प्रत्येक गेज एक अलग-अलग क्षेत्र में अलग-अलग चरित्र में स्थित है। मैंने इस मूल्य को समय आउटपुट के अंत में जोड़ना माना, लेकिन मैं चाहता हूं कि यह मेरे हस्तक्षेप के बिना सीएसटी से सीडीटी में बदल जाए।

आपकी मदद के लिए धन्यवाद।

+1

यदि आप 'psql' की '\ d readings2' के आउटपुट को पोस्ट कर सकते हैं तो यह सहायक होगा। – vyegorov

उत्तर

15

सीडीटी या सीएसटी जैसे समय क्षेत्र के नामों का उपयोग करने के बजाय, आप full Olsen-style time zone names का उपयोग करने पर विचार कर सकते हैं। केंद्रीय समय के मामले में, आप एक समय क्षेत्र चुन सकते हैं। कोई भी जो आपके स्थान से मेल खाता है, जैसे America/Chicago, या बस US/Central। यह सुनिश्चित करता है कि PostgreSQL Olsen tz डेटाबेस का उपयोग स्वचालित रूप से यह पता लगाने के लिए करता है कि किसी भी दिनांक पर डेलाइट सेविंग टाइम लागू होता है या नहीं।

5

आप निश्चित रूप से TIMESTAMP WITH TIME ZONE कॉलम चाहते हैं (जिसे PostgreSQL में timestamptz भी कहा जाता है)। वह यूटीसी में टाइमस्टैम्प स्टोर करेगा, ताकि यह समय में एक विशेष पल का प्रतिनिधित्व करेगा। नाम के सुझाव के विपरीत, यह कॉलम में एक समय क्षेत्र सहेजता है - आप AT TIME ZONE वाक्यांश के साथ अपने चयन के समय क्षेत्र में पुनर्प्राप्त टाइमस्टैम्प देख सकते हैं।

टाइमस्टैम्प के समय सारिणी समय के बिना भ्रमित और लगभग बेकार हैं। मैं दृढ़ता से अनुशंसा करता हूं कि आप उस प्रकार का उपयोग न करें जो आप वर्णन कर रहे हैं।

मैं वास्तव में प्रश्न के उस हिस्से से उलझन में हूं जो CHARACTER VARYING कॉलम में टाइमस्टैम्प संग्रहीत करने के बारे में बात करता है। ऐसा लगता है कि यह समस्या का हिस्सा हो सकता है। यदि आप इसे शुरुआत से timestamptz में स्टोर कर सकते हैं तो मुझे संदेह है कि आपको कम समस्याएं होंगी। इसे छोड़कर, यूटीसी से ऑफ़सेट के लिए -04 नोटेशन का उपयोग करना सबसे सुरक्षित होगा; लेकिन यह किसी भी लाभ के लिए मेरे लिए अधिक काम की तरह लगता है।

+1

अपने उत्तर को जोड़ने के लिए, यहां इस गहरे से निपटने वाला एक लिंक: http://phili.pe/posts/timestamps-and-time-zones-in-postgresql/ – jgburet

1

आप Guan Yang's answer में सुझाए गए प्रारूप में ज्ञात टाइमज़ोन की एक तालिका बना सकते हैं, और फिर इस तालिका में एक विदेशी कुंजी कॉलम का उपयोग कर सकते हैं। pg_timezone_names से मान्य टाइमज़ोन प्राप्त किए जा सकते हैं मैं this related answer में अधिक जानकारी में गया हूं।