जब आप timestamp with time zone
स्टोर करते हैं (timestamptz
) इसे डीबी में भंडारण के लिए यूटीसी में परिवर्तित कर दिया गया है। जब पुनर्प्राप्त किया जाता है, तो यह क्लाइंट के वर्तमान समय क्षेत्र में परिवर्तित हो जाता है, न कि उस समय क्षेत्र में, जिसमें वह मूल रूप से था। यह मूल रूप से समय का एक बिंदु है।
timestamp without time zone
. भी है (timestamp
) यह रूपांतरण के अधीन नहीं है, लेकिन नहीं है इसके साथ टाइमस्टैम्प ले जाएं। अगर आप timestamp
स्टोर करते हैं अपने क्लाइंट टाइम ज़ोन को यूटीसी पर सेट करने के बाद, क्लाइंट टाइम ज़ोन '+08:00' होने पर इसे पुनः प्राप्त करें, आपको वही मान मिलता है। आप जो चाहते हैं उसका आधा है, इसमें यह कच्चे समय के मूल्य को बरकरार रखता है।
नाम और व्यवहार भयानक और भ्रमित करने वाले हैं, लेकिन SQL मानक द्वारा निर्धारित किए गए हैं।
यदि आप किसी विशेष समय क्षेत्र में समय में एक बिंदु रिकॉर्ड करना चाहते हैं तो आपको समय क्षेत्र को अलग से संग्रहित करना होगा। मैं इसे INTERVAL
. के रूप में संग्रहीत करने की अनुशंसा करता हूं एक CHECK
के साथ इसे colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
तक सीमित करने वाली बाधा . वह परिभाषा -12:00 को अस्वीकार करती है और +12:00 को स्वीकार करती है; मुझे पूरा यकीन नहीं है कि यह सही है, इसलिए जांचें।
आप या तो timestamp
स्टोर कर सकते हैं उस समय क्षेत्र में स्थानीय समय का (मैं शायद क्या करूँगा), या timestamptz
स्टोर करें यूटीसी समय जब घटना हुई और एक ऑफसेट जो आपको इसे स्थानीय समय में बदलने की सुविधा देता है।
या तो जेडीबीसी के लिए ठीक काम करेगा। जेपीए के लिए, यह इस बात पर निर्भर करेगा कि आपका प्रदाता कितनी अच्छी तरह समझता है और अंतराल प्रकारों को मैप करता है। आदर्श रूप से आप अपनी इकाई में एक क्षणिक उत्पन्न फ़ील्ड चाहते हैं जो उस कैलेंडर उदाहरण का पुनर्निर्माण करता है जिसे आप timestamp
का उपयोग करके चाहते हैं और interval
डेटाबेस में संग्रहीत।