2011-10-17 14 views
25

Ho una relazione che mantiene i dati storici mensili. Questi dati vengono aggiunti alla tabella l'ultimo giorno di ogni mese. Un servizio che sto scrivendo può quindi essere chiamato specificando un mese e un numero di mesi prima per il quale recuperare i dati storici. Lo sto facendo creando le variabili startDate e endDate e quindi restituendo i dati tra i due. Il problema che sto avendo è che startDate è un numero variabile di mesi prima di endDate e non riesco a capire come utilizzare un periodo variabile in un intervallo.Utilizzo di un periodo variabile in un intervallo in Postgres

Ecco quello che ho:

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

So che la linea per startDate non è corretta. Come è fatto correttamente?

risposta

57

Usa questa linea:

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

e notare lo spazio prima MONTH. Fondamentalmente: si costruisce una stringa con lo 4 MONTH e la si castella con ::type in un intervallo appropriato.

Edit: ho' trovato un'altra soluzione: È possibile calcolare con interval come questo:

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

questo sembra un po' più bello per me.

+0

Questo ha funzionato perfettamente. Grazie per l'aiuto! – Belizzle

+3

Oppure: 'endDate - '1 mon' :: interval * $ 3' (meno casting e concatenazione) –

+0

Parallel thinking :-) –

3

Questo codice non ha nulla a che fare direttamente con la situazione, ma illustra come utilizzare le variabili nell'aritmetica INTERVAL. Il nome del mio tavolo è "calendario".

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; 
Problemi correlati