PostgreSQL में टाइमस्टैम्प को कैसे स्टोर करें?


20

मैं एक PostgreSQL DB डिजाइन पर काम कर रहा हूं और मैं सोच रहा हूं कि टाइमस्टैम्प को कैसे स्टोर किया जाए।

मान्यताओं

विभिन्न टाइमज़ोन में उपयोगकर्ता सभी CRUD फ़ंक्शंस के लिए डेटाबेस का उपयोग करेंगे।

मैंने 2 विकल्प देखे हैं:

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

क्योंकि timestampमैं एक स्ट्रिंग भेजूंगा जो INSERT क्षण के लिए सटीक (UTC) टाइमस्टैम्प का प्रतिनिधित्व करेगा।

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

स्टोर करने के साथ एक मुख्य लाभ bigintयह हो सकता है कि स्टोर करना और पुनः प्राप्त करना आसान होगा, क्योंकि सही ढंग से स्वरूपित टाइमस्टैम्प को पास करना एक साधारण संख्या (यूनिक्स एपोक के बाद मिली) की तुलना में अधिक जटिल है।

मेरा सवाल यह है कि सबसे लचीली डिज़ाइन के लिए कौन सा अनुमति देगा और प्रत्येक दृष्टिकोण के नुकसान क्या हो सकते हैं।


कई कारण हैं कि टाइमस्टैम्प का प्रतिनिधित्व करने के लिए एक टाइमस्टैम्प किसी बिगिंट से बेहतर है। मैं एक भी कारण के बारे में नहीं सोच सकता हूं कि एक टाइमस्टैम्प की तुलना में बिगिन बेहतर क्यों होगा।
लेनरर्ट

मुझे लगता है कि बिगआईंट आसान हो सकता है इसका मुख्य कारण यह है कि इसे पुनः प्राप्त करना और स्टोर करना बहुत आसान हो सकता है। मैं अपने सवालों को अपडेट करूंगा।
बाम

जवाबों:


23

स्टोर timestamps के रूप में timestamp, या कहें timestamptz( timestamp with time zone) के बाद से आप के साथ काम कर रहे हैं कई समय क्षेत्रों । यह मान्य डेटा को लागू करता है और आमतौर पर सबसे अधिक कुशल होता है। डेटा प्रकार को समझना सुनिश्चित करें, आसपास कुछ गलत धारणाएं तैर रही हैं:

अपनी चिंता को दूर करने के लिए:

एक सही ढंग से स्वरूपित टाइमस्टैम्प गुजरना एक सरल संख्या की तुलना में अधिक जटिल है

यदि आप चाहें तो आप UNIX युग को किसी भी तरह से पास और पुनः प्राप्त कर सकते हैं:

SELECT to_timestamp(1437346800)
     , extract(epoch FROM timestamptz '2015-07-20 01:00+02');

सम्बंधित:

यदि आप DB को राइट्स के साथ वर्तमान टाइमस्टैम्प को स्टोर करना चाहते हैं, तो timestamptz डिफ़ॉल्ट मान वाले कॉलम काnow() उपयोग करें । डीबी सर्वर पर सिस्टम का समय आम तौर पर बहुत अधिक विश्वसनीय और सुसंगत होता है, जो कई ग्राहकों की अपनी संबंधित धारणा में होता है कि यह किस समय का है।
इसके लिए INSERTयह जितना सरल हो सकता है:

CREATE TABLE foo (
  ... -- other columns
, created_at timestamptz NOT NULL DEFAULT now()
);

और बस उस कॉलम को न लिखें। यह अपने आप भर जाता है।


इससे चीजें स्पष्ट हुईं। इस तथ्य के अलावा कि टाइमस्टैम्प्स को 8-बाइट पूर्णांक के रूप में संग्रहीत किया जाता है, आवश्यक रूप से बिगिन के रूप में भंडारण, "to_timestamp" कार्यों के साथ पुनर्प्राप्ति और यह बहुत सरल विकल्प बनाता है। धन्यवाद
बैम

8

आपको हमेशा डेटा को मूल डेटाटाइप में संग्रहित करना चाहिए ताकि आप अंतर्निहित कार्यों का उपयोग कर सकें। और टाइमस्टैम्प का डेटा प्रकार स्पष्ट रूप से एक है timestamp

Btw, एक timestampहै नहीं एक स्ट्रिंग के रूप में जमा है, यह, के रूप में बिल्कुल वैसा ही एक 8 बाइट पूर्णांक के रूप में संग्रह किया गया है bigint: PostgreSQL प्रलेखन


मेरी क्षमा याचना, मेरा कहने का मतलब था कि मैं भंडारण के लिए एक स्ट्रिंग भेजूंगा , टाइमस्टैम्प स्टोर नहीं करूंगा । इसे ठीक किया।
बाम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.