• Oracle 创建时间维度表并更新是否工作日字段


    create or replace PROCEDURE PF_ETL_CREATE_DIM_OA_TIME  is
      /*PF_ETL_CREATE_DIM_OA_TIME: 生成OA时间维数据并更新工作日字段(designer:guo)
      begin_date: 起始时间20160101
      end_date:结束时间20161231
      exec PF_ETL_CREATE_DIM_OA_TIME
      delete from Dim_OA_Time where fyear>=2022;
      select * from Dim_OA_Time 
      select distinct fyear from Dim_OA_Time  order by fyear
      */
    
      begin_date nvarchar2(20);
      end_date nvarchar2(20);
      dDate date;
      f_year int;
      f_yearname nvarchar2(20);
      f_quarter int;
      f_quarter2 int;
      f_quartername nvarchar2(20);
      f_month int;
      f_monthname nvarchar2(20);
      f_datename nvarchar2(20);
      f_week int;
      f_weekname varchar2(20);
      f_weekday varchar2(20);
      f_yearfirstday date;
      f_yearlastday date;
      f_quarterfirstday date;
      f_quarterlastday date;
      f_monthfirstday date;
      f_monthlastday date;
      f_NextDate date;
      f_nextDayName nvarchar2(30);
      f_NextmonthName nvarchar2(64);
      f_TBmonthName nvarchar2(64);
      f_DateStr varchar2(64);
      adddays int;
      end_year varchar2(64);
      begin_year varchar2(64);
    BEGIN
      SELECT  to_char(extract(year from sysdate)) into begin_year from dual;
      delete from Dim_OA_Time where fyear>=to_number(begin_year);
      begin_date :=begin_year||'0101';
      SELECT  to_char(extract(year from sysdate)+5) into end_year from dual;
      end_date   := end_year||'1231';
      adddays := 1 ;
      dDate := to_date(begin_date,'yyyymmdd');
      WHILE (dDate <= to_date(end_date,'yyyymmdd'))
      loop
         f_year :=to_number(to_char(dDate, 'yyyy'));
         f_yearname := to_char(dDate,'yyyy')|| '';
    
         f_NextDate := dDate+1;
         f_DateStr := to_char(dDate,'yyyy-mm-dd');
         f_quarter := f_year*100+to_number(to_char(dDate, 'q'));
         f_quartername := f_yearname || to_char(dDate, 'q') || '季度';
         f_month := f_year*100+ to_number(to_char(dDate, 'mm'));
         f_monthname := f_yearname || to_char(dDate, 'mm')||'';
         f_datename := f_monthname||to_char(dDate, 'dd')||'';
    
         f_nextDayName := to_char(f_NextDate,'yyyy')||''||to_char(f_NextDate, 'mm')||''||to_char(f_NextDate, 'dd')||'';
         --f_weekname :=f_yearname || subStr('000'|| to_char(dDate,'fmww'), -2)||'周';
         f_weekname :=f_yearname || subStr('000'|| to_char(dDate,'IW'), -2)||'';
         f_week   := f_year*100+ to_number(to_char(dDate,'IW')); --201501
         -- f_weekday := to_char(dDate, 'day'); --星期几
         f_weekday := to_char(dDate, 'day','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE'''); --星期几
         f_yearfirstday := to_date(to_char(f_year)||'0101', 'yyyymmdd');
         f_yearlastday := to_date(to_char(f_year)||'1231', 'yyyymmdd');
         f_monthfirstday := to_date(to_char(dDate, 'yyyy')||to_char(dDate, 'mm')||'01','yyyymmdd');
         f_monthlastday :=  ADD_MONTHS(f_monthfirstday,1)-1;
    
         f_NextmonthName  := to_char(ADD_MONTHS(f_monthfirstday,1),'yyyy')||''||to_char(ADD_MONTHS(f_monthfirstday,1), 'mm')||'';
    
         f_TBmonthName := to_char(f_year+1)||''||to_char(f_NextDate, 'mm')||'';
         f_quarter2 := to_number(to_char(dDate, 'q'));
         f_quarterfirstday := ADD_MONTHS(f_yearfirstday,(f_quarter2-1)*3);
         f_quarterlastday := ADD_MONTHS(f_yearfirstday,(f_quarter2)*3)-1;
        insert into Dim_OA_Time(FDATE,FDATENAME,FYEAR,YEARNAME,FQUARTER, QUARTERNAME,FMONTH,MONTHNAME,dayname,Weekname,fWeek,Weekday
               ,Yearfirstdate,Yearlastdate,Quarterfirstdate,Quarterlastdate,Monthfirstdate,Monthlastdate,HBDayName,HBMonthName,TBmonthName)
                            values(dDate,f_DateStr,f_year,f_yearname,f_quarter,f_quartername,f_month,f_monthname,f_datename,f_weekname,f_week,f_weekday
                                 ,f_yearfirstday,f_yearlastday,f_quarterfirstday,f_quarterlastday,f_monthfirstday,f_monthlastday,f_nextDayName,f_NextmonthName,f_TBmonthName);
         dDate :=  dDate + adddays;
      END loop;
    
        --更新周末          
        update dim_oa_time set is_work ='0' where weekday in ('星期六','星期日'); 
        update dim_oa_time set is_work ='1' where weekday  not in ('星期六','星期日');
    --更新不是周末的休息日 merge into dim_oa_time using (select distinct to_date(date_num,'yyyy-mm-dd hh24:mi:ss') as date_num, is_rest from WORKTIME_SPECIALDAY where IS_REST !=0 and ORG_ACCOUNT_ID='670869647114347' ) table2 on (dim_oa_time.fdate = table2.date_num) when matched then update set dim_oa_time.is_work = '0'; --更新是周末的工作日 merge into dim_oa_time using (select distinct to_date(date_num,'yyyy-mm-dd hh24:mi:ss') as date_num, is_rest from WORKTIME_SPECIALDAY where IS_REST =0 and ORG_ACCOUNT_ID='670869647114347') table2 on (dim_oa_time.fdate = table2.date_num) when matched then update set dim_oa_time.is_work = '1'; end;
  • 相关阅读:
    微软 安全用户教育影片 有MM 哦
    数据字典是什么?
    调用Object.GetHashCode的缺省实现
    CCharp 中委托和事件的机制和应用
    C#.NET 中的类型转换
    解决在全文搜索中搜索中文字符
    ADO.NET 获取大型 数据
    Realize the Potential of Office 2003 by Creating Smart Tags in Managed Code
    MSDN 智能客户端开发人员中心
    ADO.Net 缓冲 插入大型数据
  • 原文地址:https://www.cnblogs.com/xiaobaidejiucuoben/p/14630923.html
Copyright © 2020-2023  润新知