postgresql游标数据装到数组中

由于在postgresql中获取数据集通常是使用游标cursor接收,但游标处理数据很不方便,并且耗时比较多,因此将游标数据保存到数组中是比较好的一个方法。

--创建数组类型
create type array_rest_day as 
(
	id int4,
	start_time timestamp,
	end_time timestamp
); 

--创建函数
create or replace function count_rest_day(end_time timestamp,start_time timestamp)
returns interval as $hour$
declare
	cursor_name cursor for
	(
	select * from t_rest_day t where t.start_time between start_date and end_date
	union 
	select * from t_rest_day t where t.end_time between start_date and end_date
	order by start_time
	);
	ref_datas array_rest_day[];
	row_num int;
	rest_cost interval := '0 day'
	...
begin 
	for rd in cursor_name loop  
    ref_datas[row_num]=row(rd.id, rd.start_time, rd.end_time);  
    row_num=row_num+1;  
	end loop;  
	if(ref_datas is null || array_length(ref_datas, 1) = 0) then 
		return end_time - start_time;
	end if;
	if(age(min_time,start_time) && age(end_time,max_time)) then 
		for i in 0..array_length(ref_datas, 1)-1 loop
			rest_cost = rest_cost + (ref_datas[i].end_time - ref_datas[i].start_time);
		end loop;
	end if;
	...
  return end_time-start_time-rest_cost;
end 
$hour$ LANGUAGE plpgsql;

--测试
select count_rest_day('2018-01-01 10:00:00','2018-01-02 09:00:00');
参考文献:http://625514418-qq-com.iteye.com/blog/1677384

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值