私は、generate_series()
日付/時系列の関数のバリアントをサポートしていない PostgreSQL 8.3 のバージョンに取り組んでいます。現時点では、次のような3番目の引数で関数を呼び出すこの醜い回避策があります。
select table_union('2012-12-01', '2013-02-20', 79)
の日数を決定するには、最後のパラメータを手動で計算する必要がありますgenerate_series()
。
関数呼び出しで 2 つの引数のみが必要になるように、このスクリプトを変更する最善の方法は何ですか?
このような関数に2つの引数を指定しただけで同じように動作するように以下のコードを変更する方法はありますか?
select table_union('2012-12-01', '2013-02-20')
create or replace function table_union(date_from date, date_to date, numday int)
returns void language plpgsql as $$
declare
day_1 date;
_stop_ bigint := (date_from::date - date_to::date)::int;
begin
for day_1 in
select date_from + s.a as dates from generate_series(0, $3 ) as s(a)
loop
execute 'insert into dhcp.dhcp_map select * from dhcp.final_map_'|| trim( leading ' ' from to_char(extract(month from day_1), '09')) ||'_'||
trim( leading ' ' from to_char(extract(day from day_1), '09')); --to_char introduces a leadin space use trim to remove
end loop;
end; $$;
更新:以下の回答の素晴らしい提案の後にコードを変更しようとしましたが、まだいくつかのエラーがあります:
create or replace function
table_union(date_from date, date_to date)
returns void language plpgsql
as $func$
declare day_1 date;
begin
for day_1 in select date_from
+ s.a as dates from generate_series(0, (date_to - date_from))
as s(a)
loop
execute
'insert into dhcp.dhcp_map select * from dhcp.final_map_'||
array_to_string(ARRAY(SELECT to_char(date_from + generate_series(0, (date_to - date_from)), 'MM_DD')) ) ;
end loop;
end;
$func$;