2011-10-17 19 views
25

में एक अंतराल में एक चर अवधि का उपयोग करना मेरे पास एक रिश्ता है जो मासिक ऐतिहासिक डेटा को बनाए रखता है। यह डेटा प्रत्येक महीने के अंतिम दिन तालिका में जोड़ा जाता है। एक सेवा जो मैं लिख रहा हूं उसे तब एक महीने और कई महीने पहले निर्दिष्ट किया जा सकता है जिसके लिए ऐतिहासिक डेटा पुनर्प्राप्त किया जा सकता है। मैं startDate और endDate चर बनाकर और फिर दोनों के बीच डेटा लौटकर ऐसा कर रहा हूं। मेरी समस्या यह है कि StartDate EndDate से पहले महीनों की एक परिवर्तनीय संख्या है, और मैं यह नहीं समझ सकता कि अंतराल में परिवर्तनीय अवधि का उपयोग कैसे करें।पोस्टग्रेस

DECLARE 
     endDate TIMESTAMP := (DATE_TRUNC('MONTH',$2) + INTERVAL '1 MONTH') - INTERVAL '1 DAY'; 
     startDate TIMESTAMP := endDate - INTERVAL $3 'MONTH'; 

मुझे पता है कि STARTDATE के लिए लाइन सही नहीं है:

यहाँ मैं क्या है। यह ठीक से कैसे किया जाता है?

startDate TIMESTAMP := endDate - ($3 || ' MONTH')::INTERVAL; 

और MONTH से पहले अंतरिक्ष ध्यान दें:

उत्तर

57

इस लाइन का प्रयोग करें। असल में: आप 4 MONTH जैसे स्ट्रिंग का निर्माण करते हैं और इसे उचित अंतराल में ::type के साथ डालें।

संपादित: मैं 'एक और समाधान मिल गया है: आप interval इस तरह से गणना कर सकते हैं:

startDate TIMESTAMP := endDate - $3 * INTERVAL '1 MONTH'; 

यह एक छोटा सा मेरे लिए अच्छे लग रहा है।

+0

यह पूरी तरह से काम किया। सहायता के लिए धनयवाद! – Belizzle

+3

या: 'endDate -' 1 mon ':: अंतराल * $ 3' (कम कास्टिंग और concatenating) –

+0

समांतर सोच :-) –

3

इस कोड में आपकी स्थिति के साथ सीधे कुछ भी नहीं है, लेकिन यह बताता है कि अंतराल अंकगणित में चर का उपयोग कैसे करें। मेरी तालिका का नाम "कैलेंडर" है।

CREATE OR REPLACE FUNCTION test_param(num_months integer) 
    RETURNS SETOF calendar AS 
$BODY$ 

    select * from calendar 
    where cal_date <= '2008-12-31 00:00:00' 
    and cal_date > date '2008-12-31' - ($1 || ' month')::interval; 

$BODY$ 
    LANGUAGE sql VOLATILE 
    COST 100 
    ROWS 1000; 
संबंधित मुद्दे