2010-01-21 13 views
32

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

SELECT age(now() at time zone 'UTC', now()); 

काम करता है यही कारण है कि है, लेकिन वहाँ एक और अधिक सरल तरीका है:

अंतराल मेरी डाटाबेस सर्वर के समय क्षेत्र और यूटीसी के बीच अंतर का प्रतिनिधित्व करने के लिए, मैं इस समय इस हैक का उपयोग कर रहा हूँ?

"टाइमज़ोन" नामक एक सर्वर कॉन्फ़िगरेशन पैरामीटर है जो वैध टाइमज़ोन स्ट्रिंग देता है, लेकिन मुझे नहीं लगता कि क्वेरी में उन पैरामीटरों को एक्सेस करना संभव है। (मुझे लगता है कि एक अलग सवाल है, लेकिन यह करने के लिए एक जवाब समय क्षेत्र समस्या को हल करेंगे।)

+0

प्रश्न के लिए धन्यवाद। मैंने एक पैराग्राफ जोड़ा जो समझाता है कि मैं अंतर क्यों प्राप्त करना चाहता हूं। – TimH

उत्तर

51
SELECT current_setting('TIMEZONE') 

यह एक प्रश्न में इस्तेमाल किया जा सकता है, तथापि, यह एक संख्यात्मक अंतर नहीं देता है।

आपका समाधान ठीक है।

+0

धन्यवाद, यही मुझे जानने की जरूरत है। यह काम करेगा: समय क्षेत्र current_setting ('TIMEZONE') पर कुछ_table.utc_timestamp चुनें; और यह मेरे हैक की तुलना में कोड पढ़ने वाले किसी के लिए बहुत स्पष्ट है। – TimH

+0

इसका एकमात्र नकारात्मक पक्ष यह है कि यह '-05: 00' जैसे ऑफसेट का उत्पादन कर सकता है, जो 'ऑस्ट्रेलिया/पर्थ' जैसे पूर्ण लंबाई का नाम, या यहां तक ​​कि संभावित रूप से अस्पष्ट संक्षेप जैसे 'ईएसटी' भी हो सकता है। –

+1

@ क्रेग्रिंजर: 'CURRENT_SETTING (' टाइमज़ोन ') द्वारा लौटाई गई सभी चीज़ों को बिना किसी समस्या के' समय समय क्षेत्र 'में खिलाया जा सकता है। – Quassnoi

5

प्राप्त करने के लिए एक पूर्णांक के रूप में सेकंड के अंतर का #, मैं बस का इस्तेमाल किया है:

select extract(timezone from now());