मैं PostgreSQL से वर्तमान यूनिक्स टाइमस्टैम्प कैसे प्राप्त करूं?


91

यूनिक्स 1 जनवरी, 1970 के मध्य से यूनिक्स टाइमस्टैम्प सेकंड की संख्या है।

मुझे PostgreSQL से सही यूनिक्स टाइमस्टैम्प कैसे मिलेगा?

जब currenttimestamp.com और timestamp.1e5b.de से तुलना की जा रही है, तो मुझे पोस्टग्रैजियम से अपेक्षित समय नहीं मिलेगा:

यह सही टाइमस्टैम्प लौटाता है:

SELECT extract(epoch from now());

जबकि यह नहीं है:

SELECT extract(epoch from now() at time zone 'utc');

मैं समय क्षेत्र UTC +02 में रहता हूं। PostgreSQL से वर्तमान यूनिक्स टाइमस्टैम्प प्राप्त करने का सही तरीका क्या है?

यह सही समय और समय क्षेत्र लौटाता है:

SELECT now();
              now
-------------------------------
 2011-05-18 10:34:10.820464+02

एक और तुलना:

select now(), 
extract(epoch from now()), 
extract(epoch from now() at time zone 'utc');
              now              |    date_part     |    date_part
-------------------------------+------------------+------------------
 2011-05-18 10:38:16.439332+02 | 1305707896.43933 | 1305700696.43933
(1 row)

Unix timestamp from the web sites:
1305707967

जवाबों:


82

पोस्टग्रेज में, 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 चुपचाप किसी भी समय क्षेत्र संकेत की अनदेखी करेगा


किसी भी विचार कैसे परिणामी दशमलव को दशमलव बिंदु के बिना पूर्णांक में परिवर्तित करें (मेरा मतलब संख्या और दशमलव को एक बड़े पूर्णांक के रूप में विलय करना है)। धन्यवाद।
WM

इस तरह लेकिन मुझे यकीन है कि आप वास्तव में ऐसा नहीं करना चाहते। शायद आप दस की शक्ति से गुणा करना चाहते हैं और किसी भी शेष दशमलव को छीन लेते हैं?
जैक डगलस

2
@MM शायद इस तरह? SELECT FLOOR(EXTRACT(epoch FROM NOW())*1000);
२३

21
SELECT extract(epoch from now() at time zone 'utc');

सही टाइमस्टैम्प वापस नहीं करता है क्योंकि समयक्षेत्र रूपांतरण को स्थगित करता है परिणाम से समय क्षेत्र की जानकारी को दूर फेंकता है:

9.9.3। समय ज़ोन पर

सिंटैक्स: टाइम ज़ोन के बिना टाइमस्टैम्प ज़ोन ज़ोन ज़ोन
रिटर्न: टाइम ज़ोन के साथ टाइमस्टैम्प समय क्षेत्र के
बिना टाइम स्टैम्प के अनुसार निर्दिष्ट समय क्षेत्र में स्थित है।

सिंटैक्स: टाइम ज़ोन के साथ टाइमस्टैम्प ज़ोन ज़ोन ज़ोन
रिटर्न: टाइम ज़ोन के बिना टाइमस्टैम्प समय ज़ोन के
साथ टाइम स्टैम्प को नए टाइम ज़ोन में समय ज़ोन पदनाम के साथ परिवर्तित करें

बाद में, अर्क टाइमस्टैम्प को टाइम ज़ोन के बिना देखता है और इसे स्थानीय समय मानता है (हालाँकि यह पहले से ही वास्तव में utc है)।

सही तरीका होगा:

select now(),
       extract(epoch from now()),                                          -- correct
       extract(epoch from now() at time zone 'utc'),                       -- incorrect
       extract(epoch from now() at time zone 'utc' at time zone 'utc');    -- correct

          now                  |    date_part     |    date_part     |    date_part
-------------------------------+------------------+------------------+------------------
 2014-10-14 10:19:23.726908+02 | 1413274763.72691 | 1413267563.72691 | 1413274763.72691
(1 row)

अंतिम पंक्ति में पहला at time zoneरूपांतरण करता है, दूसरा परिणाम के लिए नया समय क्षेत्र प्रदान करता है।

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