create or replace function fkr_tb_date(iv_date varchar2)
return varchar2
is
/** HEAD <四类用户 计算日报表中环比指标中的上月同一天的日期>
- @NAME
- @TYPE 月
- @PARAMETER iv_date IN varchar2 统计日期,格式:YYYYMM
- @DESCRIPTION 四类用户 计算日报表中环比指标中的上月同一天的日期
- @TARGET VGOPKR#
- @VERSION 1.0.0
- @AUTHOR LH
- @CREATE-DATE <2024-XX-XX>
- @TODO 返回值为传入日期的上一月的同一天日期数据
- @COPYRIGHT
*/
flag int(1); --闰年标记符,0:平年,1:闰年
vv_year varchar2(4);
vv_month varchar2(2);
vv_day varchar2(2);
ov_fkr_tb_date varchar2(8);
begin
flag := 0;
vv_year := substr(iv_date,1,4);
vv_month := substr(iv_date,5,2);
vv_day := substr(iv_date,7,2);
ov_fkr_tb_date := ‘0’;
–判断传入的日期是否属于闰年
if (( mod(to_number(vv_year),4) = 0 and mod(to_number(vv_year),100) != 0 ) or ( mod(to_number(vv_year),400) = 0 )) then
flag := 1;
else
flag := 0;
end if;
–处理3月份最后一天的情况
if ( flag = 1 ) then
if ( vv_month = ‘03’ and vv_day = ‘31’ ) then
ov_fkr_tb_date := to_char( add_months( to_date( iv_date,‘yyyymmdd’),-1),‘yyyymm’) || ‘29’;
return ov_fkr_tb_date;
end if;
else
if ( vv_month = ‘03’ and vv_day = ‘31’ ) then
ov_fkr_tb_date := to_char( add_months( to_date( iv_date,‘yyyymmdd’),-1),‘yyyymm’) || ‘28’;
return ov_fkr_tb_date;
end if;
end if;
–处理其他月份情况
if ( vv_month in (‘05’,‘07’,‘10’,‘12’) and vv_day = ‘31’ ) then
ov_fkr_tb_date := to_char( add_months( to_date( iv_date,‘yyyymmdd’),-1),‘yyyymm’) || ‘30’;
return ov_fkr_tb_date;
else
ov_fkr_tb_date := to_char( add_months( to_date( iv_date,‘yyyymmdd’),-1),‘yyyymm’) || vv_day;
return ov_fkr_tb_date;
end if;
end;