2009-12-26 9 views
37

के लिए समय में टाइमस्टैम्प अंतर PostgreSQL के लिए TIMESTAMPDIFF() समतुल्य है?PostgreSQL

मुझे पता है कि मैं postgresql INTERVAL प्राप्त करने के लिए दो टाइमस्टैम्प घटा सकता हूं। मैं सिर्फ एक आईएनटी द्वारा प्रतिनिधित्व घंटों में दो टाइमस्टैम्प के बीच का अंतर चाहता हूं।

मैं इस तरह MySQL में ऐसा कर सकते हैं:

TIMESTAMPDIFF(HOUR, links.created, NOW()) 

मैं सिर्फ घंटे एक पूर्णांक के रूप में प्रतिनिधित्व में दो टाइम स्टांप के बीच अंतर की जरूरत है।

समाधान मेरे लिए काम करता है:

SELECT "links_link"."created", 
"links_link"."title", 
(EXTRACT(EPOCH FROM current_timestamp - "links_link"."created")/3600)::Integer AS "age" 
FROM "links_link" 

उत्तर

62

पहले चीजों

EXTRACT(EPOCH FROM current_timestamp-somedate)/3600 

अप पॉपिंग सुंदर नहीं हो सकता है, लेकिन सड़क को खोलता है। अंतराल द्वारा अंतराल के विभाजन को परिभाषित किया गया था तो सुंदर हो सकता है।

संपादित करें: यदि आप शून्य से अधिक चाहते हैं तो या तो सबसे अच्छा या ... (0, 0) का उपयोग करें। जो भी आपके इरादे के अनुरूप है।

संपादित ++: CURRENT_DATE से (आधी रात को)घटाना: कारण है कि मैं age का उपयोग नहीं किया है कि एक ही तर्क के साथ age, प्रलेखन उद्धृत करने के लिए है। मतलब है कि मध्यरात्रि में चलने तक आपको सटीक "आयु" नहीं मिलती है। अभी यह लगभग 1:00 है यहां:

select age(current_timestamp); 
     age   
------------------ 
-00:52:40.826309 
(1 row) 
5

आप "निकालने" या अंतराल के साथ ही टाइम स्टांप पर "date_part" कार्यों का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि आप क्या चाहते हैं नहीं लगता। उदाहरण के लिए, यह '2 दिन, 3 घंटे' के अंतराल के लिए 3 देता है। हालांकि, आप 'एपोक' को निर्दिष्ट समय तत्व के रूप में निर्दिष्ट करके कई सेकंड में एक अंतराल को परिवर्तित कर सकते हैं: extract(epoch from '2 days, 3 hours'::interval) 183600 लौटाता है (जिसे आप 3600 तक विभाजित करते हैं ताकि सेकंड को घंटों में परिवर्तित किया जा सके)।

तो, यह सब एक साथ रखकर, आपको मूल रूप से माइकल का उत्तर मिलता है: extract(epoch from timestamp1 - timestamp2)/3600। आप देखभाल करने के लिए जो के बारे में टाइमस्टैम्प के पहले आता है जो, तो आप शायद रैप करने के लिए कि abs में चाहते हैं नहीं है के बाद से:

SELECT abs(extract(epoch from timestamp1 - timestamp2)/3600) 
+0

यह वास्तव में निकटतम है। सभी दशमलवों को छोड़ना एक समस्या नहीं होनी चाहिए हालांकि मैं अंतर्निहित फ़ंक्शन की कमी के कारण इसे MySQL की तरह करने के लिए दुखी हूं। – TheLizardKing

+0

कोई दशमलव नहीं होना चाहिए, क्योंकि यह पूर्णांक विभाजन कर रहा है। – araqnid

+0

अरकनिड, मैंने ऐसा भी सोचा, लेकिन मैंने अभी कोशिश की है और यह वास्तव में फ्लोट उत्पन्न करता है। –

3

यह जो डेटाबेस कार्यों का लाभ लेने के लिए, की तरह डेवलपर्स के एक बहुत करने के लिए पागल ध्वनि सकता है

लेकिन phs की तुलना करने वाले दिनांक कार्यों के साथ mysql और postgrsql के लिए अनुप्रयोगों को बनाने, बनाने और बगफिक्स करने के लिए पूरी समस्याएं होने के बाद, मैं निष्कर्ष (स्वयं के लिए) पर आया हूं, यह सबसे आसान तरीका है, जो कम एसक्यूएल सिरदर्द के साथ सबसे सरल है उनमें से किसी का लाभ उठाएं।

क्यों? क्योंकि यदि आप PHP जैसी मिडलवेयर भाषा में विकास कर रहे हैं, तो PHP में इन सभी कार्यों में से हैं, और पूर्णांक की तुलना में एप्लिकेशन ओडी में उन्हें लागू करना आसान है। PostgreSQL टाइमस्टैम्प यूनिक्स TIMESTAMP == है नहीं और MySQL के यूनिक्स टाइमस्टैम्प नहीं है PostgreSQL या दैवज्ञ टाइमस्टैम्प .. यदि आप डेटाबेस टाइम स्टांप का उपयोग बंदरगाह के लिए कठिन हो जाता है ..

तो बस संख्या के रूप में एक पूर्णांक, नहीं एक टाइमस्टैम्प, का उपयोग जनवरी 1 9 70 मध्यरात्रि के बाद से सेकंड का। और डेटाबेस टाइमस्टैम्प को कभी भी ध्यान न दें। , और gmdate() का उपयोग करें और टाइमज़ोन समस्याओं से बचने के लिए सब कुछ जीएमटी समय के रूप में स्टोर करें।

आप खोज करने, प्रकार या अन्य डेटा, या महीने या वर्ष या सप्ताह के दिन, या कुछ भी से दिन की तुलना, आपके आवेदन, और time_day, time_hour, time_seconds के लिए पूर्णांक डेटाप्रकार में की जरूरत है। या जो कुछ भी आप खोजे जाने के लिए इंडेक्स करना चाहते हैं, वह चिकनी और अधिक पोर्टेबल डेटाबेस के लिए तैयार होगा। आप केवल एक फ़ील्ड का उपयोग कर सकते हैं, ज्यादातर मामलों में: INTEGER time_created नहीं NULL

(आपके डेटाबेस पंक्ति में अधिक फ़ील्ड इस समाधान के लिए एकमात्र कमी है जो मैंने पाया है, और इससे कई सिरदर्द या कप नहीं होते हैं कॉफी :)

php की तारीख फ़ंक्शन दिनांक, की तुलना करने के लिए बकाया हैं, लेकिन तारीखों की तुलना में mysql या postgresql में? नहीं .. पूर्णांक एसक्यूएल तुलना का उपयोग करें

मुझे एहसास है कि यह एक सम्मिलित फ़ंक्शन पर CURRENT_TIMESTAMP का उपयोग करना आसान हो सकता है। हा! मूर्ख मत बनो।

आप DELETE FROM SESSION_TABLE WHERE time-initialized < '2 days' कर सकते हैं यदि समय-प्रारंभिक पोस्टग्रेस्क्ल टाइमस्टैम्प है। लेकिन आप कर सकते हैं:

DELETE FROM SESSION_TABLE WHERE time_initialized < '$yesterday'

जब तक आप 1970 कि कल था के बाद से सेकंड के पूर्णांक के रूप में php में $ कल सेट के रूप में।

पोस्टग्रेस्क्ल चयन विवरणों में टाइमस्टैम्प की तुलना में सत्र रिकॉर्ड की यह आसान हाउसकीपिंग है।

चयन आयु(), चयन निकालें(), और एस्बाइम स्वयं में सिरदर्द हैं। यह सिर्फ मेरी राय है।

आप इसके अलावा, घटाव, <,> क्या कर सकते हैं, php तारीख के साथ सभी वस्तुओं

_peter_sysko U4EA नेटवर्क, Inc

+2

तो आप कैसे सुनिश्चित करते हैं कि केवल वैध तिथियां इसे आपकी "पूर्णांक तिथि" में बनाती हैं? आप कहां जांचते हैं कि '2012-02-29' मान्य है या नहीं। आप कैसे जानते हैं कि 24 मार्च के लिए '02: 14' समय वैध है या नहीं? (संकेत दें कि यह डीएसटी नियमों के कारण हर जगह मान्य नहीं है)। और हटाना काफी आसान है: 'SESSION_TABLE से हटाएं जब समय-प्रारंभिक

1

extract(hour from age(now(),links.created)) आप घंटे के अंतर के बराबर मंजिल-गोल गिनती देता है।

+3

तीन वर्षों के बाद ... मुझे संदेह है। इसके अलावा: 'एक्सट्रैक्ट का चयन करें ('11 मॉन्स 30 घंटे 23:00:00' :: अंतराल से घंटा); 'आप केवल' 23 'और 11 महीने नहीं, 30 दिनों और 23 घंटे घंटों में व्यक्त किए गए (सीए 8660) । –

3

PostgreSQL timestamps

SELECT (
    (extract (epoch from (
     '2012-01-01 18:25:00'::timestamp - '2012-01-01 18:25:02'::timestamp 
         ) 
      ) 
    ) 
)::integer 

जो प्रिंट के बीच सेकंड अंतर मिलता है:

-2 

क्योंकि timestamps दो सेकंड का अंतर है। मिनट प्राप्त करने के लिए संख्या लें और 60 तक विभाजित करें, घंटों तक पहुंचने के लिए फिर से 60 तक विभाजित करें।

17

प्राप्त क्षेत्रों जहां एक टाइमस्टैम्प PostgreSQL में तारीख से अधिक है: PostgreSQL में टाइमस्टैम्प से

SELECT * from yourtable 
WHERE your_timestamp_field > to_date('05 Dec 2000', 'DD Mon YYYY'); 

घटाना मिनट:

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 minutes' 

घटाना PostgreSQL में टाइमस्टैम्प से घंटे:

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 hours' 
9

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

यदि आपके घटाव में डेलाइट बचत परिवर्तन-ओवर शामिल हैं, तो एक विशेष दिन को क्रमशः 23 या 25 घंटे माना जा सकता है। अंतराल इसे ध्यान में रखेगा, जो प्रतीकात्मक अर्थ में पारित दिनों की मात्रा जानने के लिए उपयोगी है लेकिन यह पारित वास्तविक घंटों की गलत संख्या देगा। अंतराल पर युग सिर्फ 24 घंटे तक गुणा करेगा।

उदाहरण के लिए, यदि एक पूर्ण 'छोटा' दिन गुजरता है और अगले दिन का अतिरिक्त घंटे, अंतराल एक दिन और एक घंटे के रूप में दर्ज किया जाएगा। जो युग/3600 में परिवर्तित 25 घंटे है। लेकिन हकीकत में 23 घंटे + 1 घंटा कुल 24 घंटे होना चाहिए।

तो सुरक्षित पद्धति है:

(EXTRACT(EPOCH FROM current_timestamp) - EXTRACT(EPOCH FROM somedate))/3600 

माइकल अपने अनुवर्ती टिप्पणी में उल्लेख किया है, आप भी शायद मंजिल() या दौर() का उपयोग करने के लिए एक पूर्णांक मान के रूप परिणाम प्राप्त करना चाहते हैं ।