2013-01-10 14 views
10

ओरेकल में मैं MONTHS_BETWEEN फ़ंक्शन का उपयोग करने के बीच महीनों का पता नहीं लगा सकता।दो तिथियों के बीच महीनों का काम

पोस्टग्रेज़ में मैं इसके लिए निकालने का कार्य कर रहा हूं। eg.like

select 
    extract(year from age(current_date, '2012-12-09')) * 12 
    + 
    extract(month from age(current_date, '2012-12-09')) 

वहाँ postgres में किसी भी अन्य तरीके (कार्यों में निर्मित) है ??

+0

भी मैं अज्ञात तर्क प्रकार के कारण उसी तरह –

उत्तर

3

दुर्भाग्य से ऐसा नहीं लगता है, क्योंकि extract(month ...) महीनों की संख्या मॉड्यूलो 12 देता है।

एक छोटा सरलीकरण है जो आप कर सकते हैं; age() के पहले पैरामीटर को निकालने - डिफ़ॉल्ट current_date से उम्र है, इसलिए इन दोनों बराबर हैं:

age(current_date, '2012-12-09') 
age('2012-12-09') 
+0

'उम्र ('2012-12-09')' (PostgreSQL 9.2.1) कोई त्रुटि उत्पन्न करेगा इस्तेमाल किया। आपको 'आयु (' 2012-12-09 ':: दिनांक) ' – araqnid

1

आप यूडीएफ का उपयोग कर सकते हैं, उदाहरण के मैंने पाया निम्नलिखित here:

CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP) 
    RETURNS INT AS $$ 
    DECLARE 
    diff_interval INTERVAL; 
    diff INT = 0; 
    years_diff INT = 0; 
    BEGIN 
    IF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THEN 
     years_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t); 

     IF units IN ('yy', 'yyyy', 'year') THEN 
     -- SQL Server does not count full years passed (only difference between year parts) 
     RETURN years_diff; 
     ELSE 
     -- If end month is less than start month it will subtracted 
     RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t)); 
     END IF; 
    END IF; 

    -- Minus operator returns interval 'DDD days HH:MI:SS' 
    diff_interval = end_t - start_t; 

    diff = diff + DATE_PART('day', diff_interval); 

    IF units IN ('wk', 'ww', 'week') THEN 
     diff = diff/7; 
     RETURN diff; 
    END IF; 

    IF units IN ('dd', 'd', 'day') THEN 
     RETURN diff; 
    END IF; 

    diff = diff * 24 + DATE_PART('hour', diff_interval); 

    IF units IN ('hh', 'hour') THEN 
     RETURN diff; 
    END IF; 

    diff = diff * 60 + DATE_PART('minute', diff_interval); 

    IF units IN ('mi', 'n', 'minute') THEN 
     RETURN diff; 
    END IF; 

    diff = diff * 60 + DATE_PART('second', diff_interval); 

    RETURN diff; 
    END; 
    $$ LANGUAGE plpgsql; 
+0

निर्दिष्ट करने की आवश्यकता है, मैंने हाल ही में एक नए डेवलपर के साथ काम किया है जिसमें इस कार्य को हमारे कुछ डेटाबेस करने के लिए डेटाबेस में शामिल किया गया है और मैं एसयूसीकेएस को प्रमाणित कर सकता हूं, यह बेहद धीमी है, कोई अनुकूलित नहीं, प्रदर्शन इतना बुरी तरह से है। यह बहुउद्देश्यीय हो सकता है, लेकिन यह एक अच्छा समाधान नहीं है। बस इस सरल तुलना की कोशिश करें: इस समारोह के खिलाफ आयु (जन्मदिन)। – FiruzzZ

10

यह PostgreSQL में फिर से लागू बस एसक्यूएल कार्यों का उपयोग कर को साफ़ रखने के लिए क्या आप पहले से ही मिल गया है करने के लिए आसान है:

create function months_of(interval) 
returns int strict immutable language sql as $$ 
    select extract(years from $1)::int * 12 + extract(month from $1)::int 
$$; 

create function months_between(date, date) 
returns int strict immutable language sql as $$ 
    select abs(months_of(age($1, $2))) 
$$; 

और अब select months_between('1978-06-20', '2011-12-09') 401 का उत्पादन ।

+6

"महीना" एक अस्पष्ट शब्द है, और दुर्भाग्य से जब आप इसके चारों ओर एक फ़ंक्शन लपेटते हैं तो यह कम अस्पष्ट नहीं होता है। 'Months_between ('2012-01-01', '2012-01-31') का उपयोग करना उस 30-दिन के अंतराल के लिए 0 देता है। लेकिन 'months_between ('2012-02-01', '2012-03-01') का उपयोग करके 'उस 2 9-दिवसीय अंतराल के लिए 1 लौटाता है। छोटी कहानी यह है कि आपको कोड लिखना शुरू करने से पहले अपने आवेदन में "महीने" का अर्थ परिभाषित करना चाहिए। –

+1

@Catcall आपकी टिप्पणी काफी मान्य है लेकिन इसे ओपी में निर्देशित नहीं किया जाना चाहिए? अराक्निड का कोड ठीक तरह से व्यवहार करता है क्योंकि ओपी का कोड ऐसा करता है, इसलिए मुझे लगता है कि वह यही चाहता है। –

+4

मुझे नहीं पता। मैंने अराक्निड के जवाब को उखाड़ फेंक दिया। मेरे अनुभव में, अधिकांश लोग जो इस तरह के कार्यों का उपयोग करते हैं * * * * * * * सप्ताह संख्या * के बारे में सोचें कि उनके आवेदन में क्या मतलब होना चाहिए। वे जो भी पाते हैं उनका उपयोग करते हैं। (यह एक अवलोकन है, आलोचना नहीं।) ओपी ने एक जवाब स्वीकार नहीं किया है, इसलिए मैं उम्मीद करता हूं कि वह जल्द ही या बाद में इन सभी चीजों को पढ़ सके। शायद मैं अवास्तविक रूप से आशावादी हूं। –

0
SELECT date_part ('year', f) * 12 
     + date_part ('month', f) 
FROM age (CURRENT_DATE, '2014-12-01') f 
संबंधित मुद्दे