资源描述:
《图解使用oracle存储过程创建时间维表》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Superromeo原创文档在使用ORACLE的过程中,可能需要判断某一天是某个月的第几周,某一天是某一年的第几周。本人使用自定义函数,调用ORACLE存储过程创建时间维表,解决了该问题。首先,在数据库内创建维度表的表结构。建表语句如下:CREATETABLETIME_DIM(DAY_KEYCHAR(8)NOTNULL,DAY_DATEDATE,DAY_YEARCHAR(4),DAY_QUARTERCHAR(1),DAY_MONTHCHAR(2),WEEK_INMONTHCHAR(1),WEEK_INYEARCHAR(2),DAY_INMO
2、NTHCHAR(2))TABLESPACEUSERSPCTUSED0PCTFREE10INITRANS1MAXTRANS255STORAGE(INITIAL64KMINEXTENTS1MAXEXTENTSUNLIMITEDPCTINCREASE0第9页共9页Superromeo原创文档BUFFER_POOLDEFAULT)LOGGINGNOCOMPRESSNOCACHENOPARALLELMONITORING;commentontableTIME_DIMis'时间维表';commentoncolumnTIME_DIM.DAY_KEYis'时
3、间';commentoncolumnTIME_DIM.DAY_DATEis'日期';commentoncolumnTIME_DIM.DAY_YEARis'年份';commentoncolumnTIME_DIM.DAY_QUARTERis'季度';commentoncolumnTIME_DIM.DAY_MONTHis'月份';commentoncolumnTIME_DIM.WEEK_INMONTHis'月份的第几周';commentoncolumnTIME_DIM.WEEK_INYEARis'年份的第几周';commentoncolumnTI
4、ME_DIM.DAY_INMONTHis'日';第9页共9页Superromeo原创文档接着,定义函数get_week_month,用于计算某一日期在当月的第几周,定义如下:createorreplacefunctionget_week_month(date1inCHAR)returnintegerisresultinteger;startdaychar(8);xingqichar(9);/*本月第一天是星期几*/week_numnumber;/*本月的第一周一共有几天*/day_numnumber;/*date1是这个月的第几天*/day
5、_num2number;beginifsubstr(date1,7,2)='01'thenresult:=1;elsestartday:=substr(date1,1,6)
6、
7、'01';selectto_char(to_date(startday,'yyyymmdd'),'day')intoxingqifromdual;select(casexingqiwhen'星期一'then7when'星期二'then6when'星期三'then5when'星期四'then4when'星期五'then3when'星期六'then2when'星期日'th
8、en1end)intoweek_num第9页共9页Superromeo原创文档fromdual;selectto_date(date1,'yyyymmdd')-to_date(startday,'yyyymmdd')+1intoday_numfromdual;ifday_num<=week_numthenresult:=1;elseday_num2:=day_num-week_num;selectceil(day_num2/7)+1intoresultfromdual;endif;endif;return(result);end;接着,定义
9、函数get_week_year,用于计算某一日期在当年的第几周,定义如下:createorreplacefunctionget_week_year(date1inCHAR)returnintegerisresultinteger;startdaychar(8);xingqichar(9);/*本年第一天是星期几*/week_numnumber;/*本年的第一周一共有几天*/day_numnumber;/*date1是本年的第几天*/第9页共9页Superromeo原创文档day_num2number;beginifsubstr(date1,
10、5,4)='0101'thenresult:=1;elsestartday:=substr(date1,1,4)
11、
12、'0101';selectto_char(to_date(st