मुझे पोस्टग्रेज 9.3 में मौजूदा टाइमज़ोन नाम कैसे मिलेगा?


85

मैं वर्तमान समय का नाम प्राप्त करना चाहता हूं। मैंने जो पहले ही प्राप्त कर लिया है, वह utc_offset/ के माध्यम से टाइमज़ोन संक्षिप्त नाम प्राप्त करना है :

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')

इससे मुझे इस समयक्षेत्र के लिए सभी कॉन्टिनेंट / कैपिटल कॉम्बिनेशन मिलते हैं लेकिन सटीक नहीं timezone। उदाहरण के लिए मुझे मिलता है:

Europe/Amsterdam
Europe/Berlin

सर्वर में है Berlinऔर मैं सर्वर का टाइमज़ोन नाम प्राप्त करना चाहता हूं।

मेरे पास जो समस्या CETहै वह हमेशा से है UTC+01:00और इसका कोई हिसाब नहीं है DST iirc


बर्लिन और एम्स्टर्डम दोनों में से किसी के लिए उचित समय क्षेत्र का नाम मध्य यूरोपीय समय (सीईटी) है। सामान्य तौर पर, समय क्षेत्र के नाम और संक्षिप्त रूप अच्छी तरह से परिभाषित नहीं होते हैं; जब एक आईएसओ मानक है तो कई देश अपनी-अपनी परिभाषाओं का उपयोग करते हैं। PostgreSQL का समर्थन भी पूरा नहीं है, कुछ विवरणों के लिए postgresql.org/docs/9.4/static/datetime-config-files.html देखें।
पैट्रिक

1
Pg_timezone_names तालिका में CET को संक्षिप्त नाम और उदाहरण के रूप में "यूरोप / बर्लिन" के रूप में परिभाषित किया गया है। मुझे नाम की जरूरत है न कि संक्षिप्त नाम की।
देउत्रो

मैंने अपनी पिछली टिप्पणी में जो लिंक दिया था, वह आपको दिखाता है कि आप अपनी ज़रूरत के हिसाब से फाइल कैसे संपादित कर सकते हैं। जो जितना मिलता है, उतना अच्छा है।
पैट्रिक

तो मुझे "यूरोप / बर्लिन" या "यूरोप / एम्स्टर्डम" में सिर्फ मुझे बताने के लिए पोस्टग्रेज का कोई रास्ता नहीं है कि मैं टाइमजोन सीईटी में हूं?
देउत्रो

क्या आप अपना प्रश्न संपादित कर सकते हैं और "I am in" को परिभाषित कर सकते हैं? एक सर्वर (आमतौर पर) एक निश्चित स्थान पर होता है और समय क्षेत्र ऑपरेटिंग सिस्टम या कॉन्फ़िगरेशन फ़ाइल से लिया जाता है। सर्वर के रूप में tz नाम निश्चित है। तो क्या आप वास्तव में डेटाबेस में सर्वर या डेटा का समय क्षेत्र नाम चाहते हैं?
पैट्रिक

जवाबों:


121

मुझे नहीं लगता कि सबसे सामान्य मामले में अकेले PostgreSQL का उपयोग करना संभव है। जब आप PostgreSQL स्थापित करते हैं, तो आप एक समय क्षेत्र चुनते हैं। मुझे पूरा यकीन है कि ऑपरेटिंग सिस्टम के टाइमज़ोन का उपयोग करने के लिए डिफ़ॉल्ट है। यह आमतौर पर postgresql.conf में पैरामीटर "टाइमज़ोन" के मान के रूप में परिलक्षित होगा। लेकिन मूल्य "स्थानीय समय" के रूप में समाप्त होता है। आप इस सेटिंग को SQL स्टेटमेंट के साथ देख सकते हैं।

show timezone;

लेकिन अगर आप postgresql.conf में टाइमज़ोन को "यूरोप / बर्लिन" जैसी किसी चीज़ में बदलते हैं, तो "स्थानीय समय" के बजाय उस मूल्य show timezone;को वापस कर देंगे ।

इसलिए मुझे लगता है कि आपके समाधान में डिफ़ॉल्ट "टाइमटाइम" के बजाय एक स्पष्ट मूल्य postgresql.conf में "टाइमज़ोन" सेट करना शामिल होगा।


आपके उत्तर के लिए धन्यवाद। अजीब तरह का है कि सिस्टम टाइमज़ोन प्राप्त करना संभव नहीं है।
देउत्रो

3
और टाइमजोन सेट करने के लिए आप उपयोग कर सकते हैं set timezone to 'UTC'
ivkremer 19

@ivkremer: set timezoneएक ग्राहक सत्र के लिए टाइमज़ोन सेट करता है; यह PostgreSQL सर्वर के लिए टाइमज़ोन सेट नहीं करता है।
माइक शेरिल 'कैट रिकॉल'

@ MikeSherrill'CatRecall 'धन्यवाद, मैंने इसकी जाँच नहीं की।
ivkremer

25

यह आपकी समस्या, ओपी को संबोधित करने में आपकी मदद कर सकता है या नहीं, लेकिन UTC ( UT1 , तकनीकी रूप से) के सापेक्ष वर्तमान सर्वर का समय क्षेत्र प्राप्त करने के लिए , ऐसा करें:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;

उपर्युक्त कार्य मिनटों में UT1-सापेक्ष ऑफसेट को निकालकर, और फिर इसे 3600 सेकंड / घंटे के कारक का उपयोग करके घंटों में परिवर्तित करता है।

उदाहरण:

SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)

( डॉक्स )।


6
एक अन्य उपयोगकर्ता ने उपयोग करने का सुझाव दियाSELECT EXTRACT(TIMEZONE_HOUR FROM now()) , लेकिन यह मामूली रूप से खतरनाक है क्योंकि यह इस तथ्य को नजरअंदाज कर देता है कि दोनों आधे और चौथाई टाइमज़ोन हैं। @ गिलादमयी
कोय जुं

2
"उत्तर कोरिया, न्यूफ़ाउंडलैंड, भारत, ईरान, अफगानिस्तान, वेनेजुएला, बर्मा, श्रीलंका, मारीकास, साथ ही ऑस्ट्रेलिया के कुछ हिस्सों में मानक समय से आधे घंटे के विचलन का उपयोग किया जाता है। कुछ राष्ट्र, जैसे नेपाल, और कुछ प्रांत, जैसे कि। चैथम द्वीप समूह, तिमाही-घंटे के विचलन का उपयोग करते हैं। " ( लिंक )
कोया

22

यह Postgresql 9.5 में ठीक काम करने लगता है :

SELECT current_setting('TIMEZONE');

मैंने आपकी आज्ञा चलाई और इसने मुझे 15,200 पंक्तियाँ वापस दीं, हालाँकि वे सभी एक ही समयक्षेत्र हैं।
सुभेंदु महंत

9

इस उत्तर को देखें: स्रोत

यदि समयक्षेत्र postgresql.conf में या सर्वर कमांड-लाइन विकल्प के रूप में निर्दिष्ट नहीं है, तो सर्वर डिफ़ॉल्ट समय क्षेत्र के रूप में टीबी वातावरण चर के मूल्य का उपयोग करने का प्रयास करता है। यदि TZ को परिभाषित नहीं किया गया है या PostgreSQL के लिए ज्ञात समय क्षेत्र नामों में से कोई भी नहीं है, तो सर्वर C लाइब्रेरी फ़ंक्शन स्थानीय समय () के व्यवहार की जाँच करके ऑपरेटिंग सिस्टम के डिफ़ॉल्ट समय क्षेत्र को निर्धारित करने का प्रयास करता है। डिफ़ॉल्ट टाइम ज़ोन को PostgreSQL के ज्ञात समय क्षेत्रों के बीच निकटतम मिलान के रूप में चुना गया है। (इन नियमों का उपयोग log_timezone के डिफ़ॉल्ट मान को चुनने के लिए भी किया जाता है, यदि निर्दिष्ट नहीं है।) स्रोत

इसका मतलब यह है कि यदि आप एक टाइमज़ोन को परिभाषित नहीं करते हैं, तो सर्वर सी लाइब्रेरी फ़ंक्शन स्थानीय समय () के व्यवहार की जांच करके ऑपरेटिंग सिस्टम के डिफ़ॉल्ट समय क्षेत्र को निर्धारित करने का प्रयास करता है।

यदि समयक्षेत्र postgresql.conf में या सर्वर कमांड-लाइन विकल्प के रूप में निर्दिष्ट नहीं है, तो सर्वर डिफ़ॉल्ट समय क्षेत्र के रूप में टीबी वातावरण चर के मूल्य का उपयोग करने का प्रयास करता है।

ऐसा लगता है कि सिस्टम का टाइमज़ोन सेट होना संभव है।

खोल से ओएस स्थानीय समय क्षेत्र प्राप्त करें। Psql में:

=> \! date +%Z

2
date +%Zकमांड क्लाइंट के टाइमज़ोन को लौटाएगा, न कि सर्वर द्वारा आपके माध्यम से जुड़ा हैpsql
यूजेन कोनकोव

9

आप निम्न स्क्रिप्ट द्वारा टाइमज़ोन तक पहुँच सकते हैं:

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting ('TIMEZONE') आपको सेटिंग्स की Continent / Capital जानकारी देगा
  • pg_timezone_names दृश्य pg_timezone_names समय ज़ोन नामों की एक सूची प्रदान करता है जो SET TIMEZONE द्वारा मान्यता प्राप्त हैं, साथ ही उनके संबंधित संक्षिप्त विवरण, यूटीसी ऑफ़सेट और दिन के उजाले-बचत की स्थिति के साथ।
  • एक दृश्य में नाम स्तंभ (pg_timezone_names) समय क्षेत्र का नाम है।

आउटपुट होगा:

name- Europe/Berlin, 
abbrev - CET, 
utc_offset- 01:00:00, 
is_dst- false
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.