展示当前日期的所有工作日

–1、建立table类型

create or replace type dateArrayType as table of nvarchar2(40);

/

–2、创建一个object类型

create or replace type map_date_object as object
(
  c_monday varchar2(50),
  c_tuesday varchar2(50),
  c_wednesday varchar2(50),
  c_thursday varchar2(100),
  c_friday varchar2(100),
  c_date1 date,
  c_date2 date,
  c_date3 date,
  c_date4 date,
  c_date5 date
);

/

–3、构建t_map_object类型

create or replace type tb_map_date_object as table of map_date_object;

/

–4、构建返回多字段管道函数
/*description:根据用户输入的日期,展示当前日期的所在星期的工作日/

create or replace function getWorkDateList(v_date in date) return
tb_map_date_object
 PIPELINED  --声明管道函数
 is
 v_data tb_map_date_object := tb_map_date_object();
 --初始化日期
 v_date1 date := v_date;
 v_date2 date := v_date+1;
 v_date3 date := v_date+2;
 v_date4 date := v_date+3;
 v_date5 date := v_date+4;
 c_monday varchar2(10) := '星期一';
 c_tuesday varchar2(10) := '星期二';
 c_wednesday varchar2(10) := '星期三';
 c_thursday varchar2(10) := '星期四';
 c_friday varchar2(10) := '星期五';
begin
   --如果v_date1是星期二
   if(checkHoliday(v_date)='3') then
       v_date1 := v_date-1;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
   --如果v_date1是星期三
   elsif(checkHoliday(v_date)='4') then
       v_date1 := v_date-2;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
    --如果v_date1是星期四
    elsif(checkHoliday(v_date)='5') then
       v_date1 := v_date-3;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
    --如果v_date1是星期五
    elsif(checkHoliday(v_date)='6') then
       v_date1 := v_date-4;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
    --如果v_date1是星期六
    elsif(checkHoliday(v_date)='7') then
       v_date1 := v_date+2;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
    --如果v_date1是星期天
    elsif(checkHoliday(v_date)='1') then
       v_date1 := v_date+1;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
     --如果v_date1是星期一
     elsif(checkHoliday(v_date)='2') then
       v_date1 := v_date;
       v_date2 := v_date1+1;
       v_date3 := v_date2+1;
       v_date4 := v_date3+1;
       v_date5 := v_date4+1;
    end if;
  for x in(
     select c_monday as v_1,c_tuesday as v_2,c_wednesday as v_3,c_thursday as v_4,c_friday as v_5,v_date1 as v_6,v_date2 as v_7,v_date3 as v_8,v_date4 as v_9,v_date5 as v_10 from dual
  )loop
  v_data.extend();
     PIPE ROW(map_date_object(x.v_1,x.v_2,x.v_3,x.v_4,x.v_5,x.v_6,x.v_7,x.v_8,x.v_9,x.v_10));
  end loop;
return;
end;

/

–5、将当期星期转化为数字(例如:星期天为数字7)

create or replace function checkHoliday(v_date in date) return varchar2
is
c_date varchar2(20) :=to_char(v_date,'d');
v_result varchar2(20) :=c_date;
begin
  return v_result;
end checkHoliday;

/
–6、调用:

select * from table(getWorkDateList(sysdate+5));
/**output:
1   星期一 星期二 星期三 星期四 星期五 2018/9/10 星期一 下午 8:23:29    2018/9/11 星期二 下午 8:23:29    2018/9/12 星期三 下午 8:23:29    2018/9/13 星期四 下午 8:23:29    2018/9/14 星期五 下午 8:23:29
**/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值