2013-01-19 5 views
6

Próbuję zautomatyzować proces uruchamiania funkcji PLPGSQL dla zakresu dat.
Zazwyczaj muszę uruchomić poniższy kod, który generuje pojedynczą tabelę dziennie na wywołaniu funkcji:Pisanie funkcji w języku SQL w celu przechodzenia między zakresami dat w 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); 

Czy jest to dobry sposób na zautomatyzowanie tego typu rzeczy z prostych pętli lub funkcji dla dowolnego zakresu dat ?

Myślę, że może być trudno poradzić sobie z przypadkami przechodzenia z miesiąca na miesiąc, więc przypuszczam, że lepiej jest przyjąć, że zakres dat dotyczy jednego miesiąca.

+0

Czy próbowałeś funkcji 'generate_series'? –

Odpowiedz

14

Nie potrzeba funkcji:

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

To będzie pracować dla dowolnego zakresu dat. Nie tylko w środku miesiąca.

+1

Znalazłem, że jest to pomocne, ale gdy go uruchomiłem, znalazłem, że zamiast zwracania wszystkich kolumn, które zostaną zwrócone, jeśli uruchomię moją funkcję tylko dla jednej daty, zamiast tego zwraca pojedynczą kolumnę ze wszystkimi oryginalnymi kolumnami połączonymi razem. Czy istnieje sposób, aby to naprawić? –

4

Prosta funkcja 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; 
  • Zastosowanie PERFORM kiedy chcesz nie dbają o wartości zwracanej.
  • Możesz po prostu dodać integer do date, aby zwiększyć. Granice miesiąca lub roku są w ten sposób nieistotne.
Powiązane problemy