2013-01-19 10 views
6

Sto tentando di automatizzare il processo di esecuzione di una funzione PLPGSQL per un intervallo di date.
In genere devo correre il seguente codice che genera una singola tabella al giorno per chiamata di funzione:Scrittura di una funzione in SQL per scorrere un intervallo di date in un UDF

SELECT dhcp.singleday('2012-11-24'::date, '2012-11-25'::date); 
SELECT dhcp.singleday('2012-11-25'::date, '2012-11-26'::date); 
SELECT dhcp.singleday('2012-11-26'::date, '2012-11-27'::date); 
SELECT dhcp.singleday('2012-11-27'::date, '2012-11-28'::date); 
SELECT dhcp.singleday('2012-11-28'::date, '2012-11-29'::date); 
SELECT dhcp.singleday('2012-11-29'::date, '2012-11-30'::date); 
SELECT dhcp.singleday('2012-11-30'::date, '2012-12-01'::date); 
SELECT dhcp.singleday('2012-12-01'::date, '2012-12-02'::date); 
SELECT dhcp.singleday('2012-12-02'::date, '2012-12-03'::date); 
SELECT dhcp.singleday('2012-12-03'::date, '2012-12-04'::date); 

C'è un buon modo per automatizzare questo genere di cose con un semplice ciclo o una funzione per un intervallo di date arbitraria ?

Sto pensando che potrebbe essere difficile gestire i casi di andare mese in mese quindi suppongo che sia meglio assumere l'intervallo di date per un singolo mese.

+0

Hai provato la funzione 'generate_series'? –

risposta

14

Non c'è bisogno di funzioni:

select dhcp.singleday(a::date, a::date + 1) 
from generate_series(
    '2012-11-24'::date, 
    '2012-12-03', 
    '1 day' 
) s(a) 

Questo funziona per qualsiasi intervallo di date. Non solo un mese interno.

+1

Ho trovato questo utile, ma quando l'ho eseguito, ho trovato che invece di restituire tutte le colonne che verrebbero restituite se eseguo la mia funzione solo per una singola data, restituisce invece una singola colonna con tutte le colonne originali concatenate insieme. C'è un modo per risolvere questo problema? –

4

semplice funzione plpgsql:

CREATE OR REPLACE FUNCTION f_machine_gun_sally(date, date) 
    RETURNS void AS 
$func$ 
DECLARE 
    d date := $1; 
BEGIN 

LOOP 
    PERFORM dhcp.singleday(d, d+1); 
    d := d + 1; 
    EXIT WHEN d > $2; 
END LOOP; 

END 
$func$ LANGUAGE plpgsql; 
  • Usa PERFORM quando si desidera non si preoccupano il valore di ritorno.
  • È possibile aggiungere un numero integer a un date per incrementare. I confini del mese o dell'anno sono irrilevanti in questo modo.
Problemi correlati