दुर्भाग्य से कुछ चीजें आपके खिलाफ काम कर रही हैं:
- Postgres सत्र में PostgreSQL JDBC ड्राइवर आपके JVM टाइमज़ोन में टाइमज़ोन सेट करता है। तो भले ही आपका डेटाबेस सर्वर यूटीसी में चल रहा हो, आपके जेवीएम के समय क्षेत्र का उपयोग करके एक टाइमस्टैम्प फ़ील्ड डाला जाएगा। जब आप डेटा डालते हैं या क्वेरी करते हैं तो डेटाबेस सर्वर हमेशा JVM समय क्षेत्र का उपयोग करेगा।
- आप TIMESTAMPTZ के बजाय TIMESTAMP का उपयोग कर रहे हैं। इन प्रकारों का विवरण उनके वास्तविक उपयोग को नहीं दर्शाता है। TIMESTAMPTZ वास्तव में समय क्षेत्र अज्ञेयवादी है। आप जो भी मूल्य डालेंगे, उसे सत्र समयक्षेत्र का उपयोग करके यूटीसी में समायोजित किया जाएगा।
इन दो मुद्दों के कारण, यदि आपके पास दो अलग-अलग जेवीएम हैं - एक लॉस एंजिल्स समय का उपयोग कर रहा है और दूसरा न्यूयॉर्क समय का उपयोग कर रहा है - जब भी आप एक जेवीएम के साथ टाइमस्टैम्प लिखते हैं तो यह दूसरे जेवीएम में एक अलग "यूटीसी समय" होगा। TIMESTAMP समायोजित मान लेता है और दिए गए अनुसार इसका उपयोग करता है। यदि आप अपने TIMESTAMP कॉलम को TIMESTAMPTZ में बदलते हैं तो दोनों JVM में एक ही समय हमेशा एक ही UTC समय होगा।
यदि आप पोस्टग्रेज JDBC ड्राइवर के ConnectionFactoryImpl#openConnectionImp को देखते हैं तो आप देख सकते हैं कि यह आपके स्थानीय JVM के समय क्षेत्र को डेटाबेस सर्वर के सत्र क्षेत्र के लिए समय क्षेत्र के रूप में कहाँ सेट करता है।
तो इससे निपटने का एकमात्र समझदार तरीका केवल TIMESTAMPTZ के बजाय TIMESTAMPTZ का उपयोग करना है। इसके बारे में कुछ और जानकारी यहां दी गई है:
PostgreSQL/JDBC और TIMESTAMP बनाम TIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html