表定义:
CREATE TABLE `time_dim` ( `DAY_KEY` char(8) DEFAULT NULL COMMENT '时间', `DAY_DATE` date DEFAULT NULL COMMENT '日期', `DAY_YEAR` char(4) DEFAULT NULL COMMENT '年份', `DAY_QUARTER` char(2) DEFAULT NULL COMMENT '季度', `DAY_MONTH` char(2) DEFAULT NULL COMMENT '月份', `week_inmonth` char(1) DEFAULT NULL COMMENT '月份的第几周', `WEEK_INYEAR` char(2) DEFAULT NULL COMMENT '年份的第几周', `DAY_INMONTH` char(2) DEFAULT NULL COMMENT '日' ) ENGINE=InnoDB DEFAULT CHARSET=utf8
思路:
当前日期 - 这个月的第一天 +1 = 这个月的第几天 n
1.通过内置函数得到这个月1号是星期几,从而得到第一周有多少天 m
2.n<=m在第一周内 属于第一周
n>m在第一周外 (n-m)/7+1 得到周数
DELIMITER $$ USE `test`$$ DROP FUNCTION IF EXISTS `get_week_month`$$ CREATE DEFINER=`root`@`localhost` FUNCTION `get_week_month`(date1 CHAR(10)) RETURNS CHAR(10) BEGIN DECLARE result INT(11); DECLARE startday CHAR(8); DECLARE xingqi CHAR(10); /*本月的第一天是星期几*/ DECLARE week_num INT(11); /*本月的第一周一共有几天*/ DECLARE day_num INT(11); /*date1 是这个月的第几天*/ DECLARE day_num2 INT(11); DECLARE tmp_date1 DATE; DECLARE tmp_date2 DATE; IF SUBSTRING(date1,7,2)='01' THEN SET result=1; ELSE SET startday=CONCAT(SUBSTRING(date1,1,6),'01'); SET xingqi=DAYOFWEEK(STR_TO_DATE(startday,'%Y%m%d')); SELECT CASE xingqi WHEN '2' THEN 7 WHEN '3' THEN 6 WHEN '4' THEN 5 WHEN '5' THEN 4 WHEN '6' THEN 3 WHEN '7' THEN 2 WHEN '1' THEN 1 END INTO @week_num1; SET week_num=@week_num1; SET tmp_date1=STR_TO_DATE(date1,'%Y%m%d'); SET tmp_date2=STR_TO_DATE(startday,'%Y%m%d'); SET day_num=(DATEDIFF(tmp_date1,tmp_date2)+1); IF day_num <=week_num THEN SET result=1; ELSE SET day_num2=day_num-week_num; SET result=(CEILING(day_num2/7)+1); END IF; END IF; RETURN result; END$$ DELIMITER ;