2013-01-19 23 views
6

içinde bir döngü aralığı için SQL'de bir işlev yazma Bir tarih aralığı için bir PLPGSQL işlevini çalıştırma işlemini otomatikleştirmeye çalışıyorum. keyfi bir tarih aralığı için basit bir döngü veya fonksiyonu ile bu tür bir şey otomatikleştirmek için iyi bir yolu var mıBir tarih aralığı boyunca 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); 

:
Genellikle ben işlev çağrısı başına günlük tek tablo oluşturur aşağıdaki kodu çalıştırmak zorunda ?

Aydan aya kadar olan olayları ele almanın zor olabileceğini düşünüyorum; bu nedenle, tarih aralığının tek bir ay için daha iyi olduğunu varsayıyorum.

+0

"generate_series" işlevini denediniz mi? –

cevap

14

fonksiyonları için gerek yok:

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

Bu herhangi bir tarih aralığı için çalışacaktır. Sadece bir ay içinde değil.

+1

Yardım etmek için bunu buldum, ancak çalıştırdığımda, yalnızca tek bir tarih için işlevimi çalıştırırsam döndürülen tüm sütunları döndürmekten ziyade, bunun yerine tüm orijinal sütunları tek bir sütun döndürdüğünü buldum birlikte. Bunu düzeltmenin bir yolu var mı? –

4

Basit plpgsql fonksiyonu:

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; 
  • Kullanım PERFORM Eğer dönüş değeri umurumda değil istiyorum.
  • Arttırmak için date'a integer ekleyebilirsiniz. Ay veya yıl sınırları bu şekilde ilgisizdir.
İlgili konular