2013-10-30 7 views
9

में समर्थित सबसे पुराना टाइमस्टैम्प मैं कई अलग-अलग समय क्षेत्रों (और समय की अवधि) में अलग-अलग डेटाबेस के साथ काम करता हूं और एक चीज जो आम तौर पर समस्याओं को उत्पन्न करती है, दिनांक/समय परिभाषा है।PostgreSQL

इस कारण से, और चूंकि तिथि एक प्रारंभिक मूल्य का संदर्भ है, यह ट्रैक रखने के लिए कि इसकी गणना कैसे की गई थी, मैं आधार दिनांक को स्टोर करने का प्रयास करता हूं; i.e .: उस विशेष कंप्यूटर/डेटाबेस में समर्थित न्यूनतम दिनांक;

यदि मैं इसे अच्छी तरह से देख रहा हूं, तो यह आरडीबीएमएस और प्रकार के विशेष भंडारण पर निर्भर करता है। SQL सर्वर में, मुझे इस "आधार दिनांक" की गणना करने के कुछ तरीके मिले;

SELECT CONVERT(DATETIME, 0) 

या

SELECT DATEADD(MONTH, 0, 0) 

या यहाँ तक कि इस तरह की एक डाली:

DECLARE @300 BINARY(8) 
SET @300 = 0x00000000 + CAST(300 AS BINARY(4)) 
set @dt=(SELECT CAST(@300 AS DATETIME) AS BASEDATE) 
print CAST(@dt AS NVARCHAR(100)) 

मेरा प्रश्न है (जहां @dt एक datetime चर रहा है), वहाँ एक समान है PostgreSQL में आधार दिनांक की गणना करने का तरीका, यानी: वह मान जो न्यूनतम दिनांक समर्थित है और सभी गणनाओं के आधार पर है?

date type के वर्णन से, मैं देख सकता हूँ कि समर्थित न्यूनतम तारीख 4713 ईसा पूर्व है, लेकिन (एक स्वरूपित तारीख स्ट्रिंग के रूप में उदाहरण के लिए) प्रोग्राम के रूप में यह मान रही का एक तरीका है, जैसा कि मैंने एसक्यूएल सर्वर में करते हैं?

+1

आप SQL सर्वर में यह "0 दिनांक" आधार दिनांक को अच्छी तरह से कॉल कर सकते हैं, लेकिन यदि आपको लगता है कि यह न्यूनतम दिनांक भी समर्थित है (और आपके शब्द से, ऐसा लगता है कि आप ऐसा करते हैं), तो आप गलत हैं। यह '1 9 00-01-01 'में परिवर्तित हो जाएगा, और' smalldatetime' एकमात्र दिनांक/समय प्रकार है जो इससे पहले की तारीखों को संभाल नहीं सकता है। तर्कसंगत रूप से अधिक व्यापक रूप से उपयोग किए जाने वाले 'डेटाटाइम' की तारीख '1753-01-01 'तक है, और नए प्रकार' दिनांक', 'डेटाटाइम 2',' डेटाटाइमसेट 'समर्थन मूल्य' 0001-01-01' तक, केवल FYI तक का समर्थन करता है। –

+0

चूंकि मैं न्यूनतम मान के बजाए संदर्भ की तलाश में हूं (हालांकि मैं न्यूनतम मान संदर्भ के रूप में कार्य कर सकता हूं ...), मैं इसके साथ रहूंगा: to_timestamp (0) :: date; – doublebyte

उत्तर

4

सबसे पुराना टाइमस्टैम्प '-इनफिनिटी' है। यह एक विशेष मूल्य है। दूसरी तरफ 'अनंतता' है जो बाद में किसी भी विशिष्ट टाइमस्टैम्प से है।

मुझे इस प्रोग्रामेटिक तरीके से प्राप्त करने का कोई तरीका नहीं पता है। मैं उस मूल्य का उपयोग केवल कड़ी-कोडित करता हूं जिस तरह से आप नल का उपयोग कर सकते हैं। इसका मतलब है कि आपको ग्राहक पक्ष पर infinities को संभालना है।

+0

धन्यवाद। और इसमें जोड़ने के लिए, निम्नलिखित पैरियल प्रश्न हैं: 'चुनें (' -इनफिनिटी ':: टाइमस्टैम्प्ट्ज़)> (' 2000-01-01 ':: टाइमस्टैम्प्ट्ज़)' और 'चुनें (' अनंतता ':: टाइमस्टैम्प्ट्ज़)> ('2000-01-01' :: timestamptz) जीसीसी (यूबंटू 4.8.2-19ubuntu1) द्वारा संकलित x86_64-pc-linux-gnu पर 'PostgreSQL 9.6.2' क्रमशः 'सत्य' और 'झूठी' का उत्पादन '4.8.2 , 64-बिट'। –

8

The manual states the values के रूप में:

  • कम मूल्य: 4713 ईसा पूर्व
  • उच्च मूल्य: 294,276 ई
चेतावनी के साथ

, के रूप में क्रिस ने कहा कि -infinity भी समर्थित है।

नोट मैन्युअल में उसी पृष्ठ में देखें; उपर्युक्त केवल तभी सच है यदि आप पूर्णांक टाइमस्टैम्प का उपयोग कर रहे हैं, जो PostgreSQL के सभी अस्पष्ट संस्करणों में डिफ़ॉल्ट हैं। संदेह में हैं:

SHOW integer_datetimes; 

आपको बता देंगे। यदि आप इसके बजाय फ़्लोटिंग पॉइंट डेटाटाइम का उपयोग कर रहे हैं, तो आपको अधिक रेंज और कम (गैर-रैखिक) सटीकता मिलती है। न्यूनतम प्रोग्रामेटिक रूप से काम करने का कोई भी प्रयास उस प्रतिबंध से निपटना होगा।

पोस्टग्रेएसक्यूएल आपको न्यूनतम संभव टाइमस्टैम्प प्राप्त करने के लिए केवल टाइमस्टैम्प पर शून्य नहीं डालने देता है, और न ही यदि आप फ़्लोटिंग पॉइंट डेटटाइम्स का उपयोग कर रहे थे तो इससे अधिक समझदारी होगी।आप जूलियन तिथि रूपांतरण समारोह का उपयोग कर सकते हैं, लेकिन यह आप युग नहीं न्यूनतम समय देता है:

postgres=> select to_timestamp(0); 
     to_timestamp  
------------------------ 
1970-01-01 08:00:00+08 
(1 row) 

क्योंकि यह नकारात्मक मान स्वीकार करता है। आपको लगता है कि चाहते हैं कि यह नकारात्मक maxint दे रही है काम करेंगे, लेकिन परिणाम बात करने के लिए आश्चर्य की बात मैं कहाँ आश्चर्य है कि अगर हम एक चादर के आसपास बग यहाँ गुप्त मिल गया है कर रहे हैं:

तथ्य यह है कि करने के लिए
postgres=> select to_timestamp(-922337203685477); 
      to_timestamp   
--------------------------------- 
294247-01-10 12:00:54.775808+08 
(1 row) 

postgres=> select to_timestamp(-92233720368547); 
      to_timestamp   
--------------------------------- 
294247-01-10 12:00:54.775808+08 
(1 row) 

postgres=> select to_timestamp(-9223372036854); 
     to_timestamp   
------------------------------ 
294247-01-10 12:00:55.552+08 
(1 row) 

postgres=> select to_timestamp(-922337203685); 
ERROR: timestamp out of range 
postgres=> select to_timestamp(-92233720368); 
      to_timestamp   
--------------------------------- 
0954-03-26 09:50:36+07:43:24 BC 
(1 row) 

postgres=> select to_timestamp(-9223372036); 
     to_timestamp   
------------------------------ 
1677-09-21 07:56:08+07:43:24 
(1 row) 

(शायद संबंधित to_timestamp एक डबल लेता है, भले ही टाइमस्टैम्प इन दिनों पूर्णांक के रूप में संग्रहीत किया जाता है?)।

मुझे लगता है कि टाइमस्टैंप रेंज को किसी भी टाइमस्टैम्प को बस एक त्रुटि प्राप्त करने की संभावना नहीं है। सब के बाद, वैध टाइम स्टांप की रेंज लगातार नहीं है:

postgres=> SELECT TIMESTAMP '2000-02-29'; 
     timestamp  
--------------------- 
2000-02-29 00:00:00 
(1 row) 

postgres=> SELECT TIMESTAMP '2001-02-29'; 
ERROR: date/time field value out of range: "2001-02-29" 
LINE 1: SELECT TIMESTAMP '2001-02-29'; 

ताकि आप उस कल्पना नहीं कर सकते सिर्फ इसलिए कि एक मूल्य के दो वैध टाइमस्टैंप के बीच है, यह अपने स्वयं मान्य है।

+0

असल में यह वास्तव में अजीब है, कि PostgreSQL उन मानों को स्वीकार करता है जो त्रुटि को फेंकने के बजाए अनुमत अंतराल का विस्तार करते हैं। मुझे लगता है कि न्यूनतम दिनांक की गणना करने के लिए यह समझदारी होगी, क्योंकि न्यूनतम समर्थित पूर्णांक (या क्रेग के उत्तर सुझाव, BigInt) के रूप में गणना की गई तारीख। PostgreSQL 9.3 मैनुअल में, यह कहा गया है कि न्यूनतम समर्थित BigInt is -9223372036854775808 है। इसलिए, मुझे इस तरह की न्यूनतम तारीख की गणना करने में सक्षम होना चाहिए: "to_timestamp (-9223372036854775808) :: दिनांक" का चयन करें, जो परिणामस्वरूप "294247-01-10" परिणाम देता है, मैन्युअल से सुझाए गए 4713 ईसा पूर्व से मेल नहीं खाता! ! – doublebyte

+0

@doublebyte 'चयन निकालने के आउटपुट (टाइमस्टैम्प से युग 2 9 4247-01-10') के आउटपुट द्वारा भी weirder बनाया; '। अत्यधिक मूल्यों पर दिनांक कार्यों की शुद्धता से आश्वस्त नहीं। –