पोस्टग्रेज में, timestamp with time zone
संक्षिप्त रूप timestamptz
में और के timestamp without time zone
रूप में किया जा सकता है timestamp
। मैं सादगी के लिए छोटे प्रकार के नामों का उपयोग करूंगा।
एक postgres से यूनिक्स टाइमस्टैम्प हो रही है timestamptz
की तरह now()
, सरल है के रूप में आप कहते हैं, बस:
select extract(epoch from now());
वास्तव में आप सभी को किसी भी प्रकार से पूर्ण समय प्राप्त करने के बारे में जानने की आवश्यकता है timestamptz
, जिसमें शामिल हैं now()
।
जब आपके पास कोई timestamp
क्षेत्र होता है तो चीजें जटिल हो जाती हैं ।
जब आप उस क्षेत्र में timestamptz
डेटा डालते हैं now()
, तो इसे पहले एक विशेष समय-क्षेत्र में परिवर्तित किया जाएगा (या तो स्पष्ट रूप से at time zone
या सत्र टाइमज़ोन में परिवर्तित करके) और समय-क्षेत्र की जानकारी को छोड़ दिया जाता है । यह अब एक पूर्ण समय को संदर्भित नहीं करता है। यही कारण है कि आप आमतौर पर टाइमस्टैम्प को स्टोर नहीं करना चाहते हैं timestamp
और सामान्य रूप से उपयोग करेंगे timestamptz
- हो सकता है कि हर टाइमज़ोन में किसी विशेष तारीख को शाम 6 बजे एक फिल्म रिलीज़ हो , यही उपयोग का मामला है।
यदि आप कभी भी एक ही समय क्षेत्र में काम करते हैं तो आप (मिस) का उपयोग करके दूर हो सकते हैं timestamp
। रूपांतरण वापस करने के timestamptz
लिए डीएसटी का सामना करने के लिए पर्याप्त चतुर है, और टाइमस्टैम्प को वर्तमान समय क्षेत्र में रूपांतरण के उद्देश्यों के लिए ग्रहण किया जाता है। यहाँ GMT / BST के लिए एक उदाहरण दिया गया है:
select '2011-03-27 00:59:00.0+00'::timestamptz::timestamp::timestamptz
, '2011-03-27 01:00:00.0+00'::timestamptz::timestamp::timestamptz;
/*
|timestamptz |timestamptz |
|:---------------------|:---------------------|
|2011-03-27 00:59:00+00|2011-03-27 02:00:00+01|
*/
DBFiddle
लेकिन, निम्नलिखित भ्रामक व्यवहार पर ध्यान दें:
set timezone to 0;
values(1, '1970-01-01 00:00:00+00'::timestamp::timestamptz)
, (2, '1970-01-01 00:00:00+02'::timestamp::timestamptz);
/*
|column1|column2 |
|------:|:---------------------|
| 1|1970-01-01 00:00:00+00|
| 2|1970-01-01 00:00:00+00|
*/
DBFiddle
इसका कारण यह है :
PostgreSQL कभी भी अपने प्रकार का निर्धारण करने से पहले शाब्दिक स्ट्रिंग की सामग्री की जांच नहीं करता है, और इसलिए दोनों […] समय क्षेत्र के बिना टाइमस्टैम्प के रूप में व्यवहार करेगा। यह सुनिश्चित करने के लिए कि एक शाब्दिक समय क्षेत्र के साथ टाइमस्टैम्प के रूप में व्यवहार किया जाता है, इसे सही स्पष्ट प्रकार दें ... एक शाब्दिक में जो समय क्षेत्र के बिना टाइमस्टैम्प के लिए निर्धारित किया गया है, PostgreSQL चुपचाप किसी भी समय क्षेत्र संकेत की अनदेखी करेगा