-- 建表SQL
CREATE TABLE `dict_date` (
  `date_key` int NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `date_id` date NOT NULL COMMENT 'yyyy-mm-dd',
  `date_short` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'yyyymmdd',
  `date_long` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'yyyy年mm月dd日',
  `week_day` int DEFAULT NULL COMMENT '星期',
  `week_first_date` datetime DEFAULT NULL COMMENT '星期开始时间',
  `week_last_date` datetime DEFAULT NULL COMMENT '星期结束时间',
  `week_long` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '星期几',
  `week_long_en` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '星期几(英文)',
  `week_short` int DEFAULT NULL COMMENT '一年中第几周 ww',
  `week_of_year_short` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '一年中第几周  yyyy_ww',
  `week_of_year_long` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '一年中第几周 ',
  `week_of_month` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '一月中 第一周',
  `month_short` int DEFAULT NULL COMMENT '一年中第几月 mm 仅月份(数字形式)',
  `month_of_year` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '一年中第几月yyyy-mm 年月',
  `month_of_year_short` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '一年中第几月 仅月份中文',
  `month_en` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '月份(英文)',
  `month_first_date` datetime DEFAULT NULL COMMENT '本月第一天日期',
  `month_last_date` datetime DEFAULT NULL COMMENT '本月最后一天日期',
  `month_of_year_long` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'yyyy年 第mm月',
  `ny_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自然年财年名称',
  `ny_quarter_short` int DEFAULT NULL COMMENT '自然年 季度1,2,3,4',
  `ny_quarter_long` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自然年财年 季度Q1,Q2,Q3,Q4',
  `ny_quarter_of_year_short` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自然年财年 季度yyyy_q',
  `ny_quarter_of_year_middle` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自然年财年 季度yyyy_Qq',
  `ny_quarter_of_year_long` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自然年财年 季度yyyy年 第q季度',
  `fy_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公司内财年名称',
  `fy_quarter_short` int DEFAULT NULL COMMENT '公司内财年 季度1,2,3,4',
  `fy_quarter_long` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公司内财年 季度Q1,Q2,Q3,Q4',
  `fy_quarter_of_year_short` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公司内财年 季度yyyy_q',
  `fy_quarter_of_year_middle` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公司内财年 季度yyyy_Qq',
  `fy_quarter_of_year_long` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公司内财年 季度yyyy年 第q季度',
  `year_short` int DEFAULT NULL COMMENT 'yyyy',
  `year_long` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'yyyy年',
  `day_of_week` int DEFAULT NULL COMMENT '本周第几天',
  `day_of_month` int DEFAULT NULL COMMENT '本月第几天',
  `day_of_year` int DEFAULT NULL COMMENT '本年第几天',
  `is_holiday` tinyint DEFAULT NULL COMMENT '是否假期1是0否',
  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '备注',
  PRIMARY KEY (`date_key`,`date_id`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='日期字典表';
drop PROCEDURE if EXISTS f_dim_date;
CREATE PROCEDURE f_dim_date ( IN start_date VARCHAR ( 20 ), IN end_date VARCHAR ( 20 ) ) BEGIN
  SET start_date = STR_TO_DATE( start_date, '%Y-%m-%d %H:%i:%s' );
  SET end_date = STR_TO_DATE( end_date, '%Y-%m-%d %H:%i:%s' );
  truncate table dict_date;
  WHILE
      start_date <= end_date DO
      INSERT INTO dict_date (
        date_id,
        date_short,
        date_long,
        week_day,
        week_first_date,
        week_last_date,
        week_long,
        week_long_en,
        week_short,
        week_of_year_short,
        week_of_year_long,
        week_of_month,
        month_short,
        month_of_year,
        month_of_year_short,
        month_en,
        month_first_date,
        month_last_date,
        month_of_year_long,
        
        ny_name,
        ny_quarter_short,
        ny_quarter_long,
        ny_quarter_of_year_short,
        ny_quarter_of_year_middle,
        ny_quarter_of_year_long,
        
        fy_name,
        fy_quarter_short,
        fy_quarter_long,
        fy_quarter_of_year_short,
        fy_quarter_of_year_middle,
        fy_quarter_of_year_long,
        year_short,
        year_long,
        day_of_week,
        day_of_month,
        day_of_year,
        is_holiday,
        description 
      ) select
 t1.date_id
,t1.date_short
,t1.date_long
,t1.week_day
,t1.week_first_date
,t1.week_last_date
,t1.week_long
,t1.week_long_en
,t1.week_short
,t1.week_of_year_short
,t1.week_of_year_long
,t1.week_of_month
,t1.month_short
,t1.month_of_year
,t1.month_of_year_short
,t1.month_en
,t1.month_first_date
,t1.month_last_date
,t1.month_of_year_long
,t1.ny_name
,t1.ny_quarter_short
,t1.ny_quarter_long
,t1.ny_quarter_of_year_short
,t1.ny_quarter_of_year_middle
,t1.ny_quarter_of_year_long
,concat(t1.fy_year,'财年') as fy_name
,case ny_quarter_short when 1 then 3 when 2 then 4 when 3 then 1 when 4 then 2 end as fy_quarter_short
,case ny_quarter_short when 1 then 'Q3' when 2 then 'Q4'  when 3 then 'Q1'  when 4 then 'Q2'  end as fy_quarter_long
,case ny_quarter_short when 1 then concat(t1.fy_year,'_3') when 2 then concat(t1.fy_year,'_4') when 3 then concat(t1.fy_year,'_1') when 4 then concat(t1.fy_year,'_2') end as fy_quarter_of_year_short
,case ny_quarter_short when 1 then concat(t1.fy_year,'_Q3') when 2 then concat(t1.fy_year,'_Q4') when 3 then concat(t1.fy_year,'_Q1') when 4 then concat(t1.fy_year,'_Q2') end as fy_quarter_of_year_middle
,case ny_quarter_short when 1 then concat(t1.fy_year,'财年 第3季度') when 2 then concat(t1.fy_year,'财年 第4季度') when 3 then concat(t1.fy_year,'财年 第1季度') when 4 then concat(t1.fy_year,'财年 第2季度') end as fy_quarter_of_year_long
,t1.year_short
,t1.year_long
,t1.day_of_week
,t1.day_of_month
,t1.day_of_year
,t1.is_holiday
,t1.description
from (
SELECT
      start_date date_id,
      DATE_FORMAT( start_date, '%Y%m%d' ) date_short,
      DATE_FORMAT( start_date, '%Y年%m月%d日' ) date_long,
      DATE_FORMAT( STR_TO_DATE( start_date, '%Y-%m-%d %H:%i:%s' ), '%w' ) AS week_day,
      date_sub( start_date, INTERVAL WEEKDAY( start_date ) + 0 DAY ) AS week_first_date,
      date_sub( start_date, INTERVAL WEEKDAY( start_date ) - 6 DAY ) AS week_last_date,
    CASE
        DATE_FORMAT( STR_TO_DATE( start_date, '%Y-%m-%d %H:%i:%s' ), '%w' ) 
        WHEN 1 THEN
        '星期一' 
        WHEN 2 THEN
        '星期二' 
        WHEN 3 THEN
        '星期三' 
        WHEN 4 THEN
        '星期四' 
        WHEN 5 THEN
        '星期五' 
        WHEN 6 THEN
        '星期六' 
        WHEN 0 THEN
        '星期天' 
      END AS week_long,
      DATE_FORMAT( STR_TO_DATE( start_date, '%Y-%m-%d %H:%i:%s' ), '%W' ) week_long_en,
      DATE_FORMAT( start_date, '%u' ) week_short,
      (DAY ( start_date )+ WEEKDAY( start_date - INTERVAL DAY ( start_date ) DAY )) DIV 7 + 1 week_of_month,
      DATE_FORMAT( start_date, '%Y_%u' ) week_of_year_short,
      DATE_FORMAT( start_date, '%Y年 第%u周' ) week_of_year_long,
      DATE_FORMAT( start_date, '%m' ) month_short,
      DATE_FORMAT( start_date, '%Y-%m' ) month_of_year,
    CASE
        DATE_FORMAT( STR_TO_DATE( start_date, '%Y-%m-%d %H:%i:%s' ), '%c' ) 
        WHEN 1 THEN
        '一月' 
        WHEN 2 THEN
        '二月' 
        WHEN 3 THEN
        '三月' 
        WHEN 4 THEN
        '四月' 
        WHEN 5 THEN
        '五月' 
        WHEN 6 THEN
        '六月' 
        WHEN 7 THEN
        '七月' 
        WHEN 8 THEN
        '八月' 
        WHEN 9 THEN
        '九月' 
        WHEN 10 THEN
        '十月' 
        WHEN 11 THEN
        '十一月' 
        WHEN 12 THEN
        '十二月' 
      END AS month_of_year_short,
      DATE_FORMAT( STR_TO_DATE( start_date, '%Y-%m-%d %H:%i:%s' ), '%b' ) AS month_en,
      DATE_ADD( start_date, INTERVAL - DAY ( start_date )+ 1 DAY ) AS month_first_date,
      last_day( start_date ) AS month_last_date,
      DATE_FORMAT( start_date, '%Y年 第%m月' ) month_of_year_long,
      
      concat(DATE_FORMAT( start_date, '%Y' ) ,'财年') as ny_name,
      QUARTER ( start_date ) ny_quarter_short,
      CONCAT('Q',QUARTER ( start_date )) ny_quarter_long,
      CONCAT(DATE_FORMAT( start_date, '%Y' ),'_',QUARTER ( start_date )) ny_quarter_of_year_short,
      CONCAT(DATE_FORMAT( start_date, '%Y' ),'_Q',QUARTER ( start_date )) ny_quarter_of_year_middle,
      CONCAT(DATE_FORMAT( start_date, '%Y' ), '年 第',QUARTER ( start_date ), '季度' ) ny_quarter_of_year_long,
      
      case when DATE_FORMAT( start_date, '%Y-%m-%d' ) >= concat(DATE_FORMAT( start_date, '%Y' ),'-07-01') 
              and DATE_FORMAT( start_date, '%Y-%m-%d' ) <= concat(DATE_FORMAT( start_date, '%Y' ) + 1,'-06-30')
          then (DATE_FORMAT( start_date, '%Y' )+1)
        else DATE_FORMAT( start_date, '%Y' )
      end as fy_year,
      
      DATE_FORMAT( start_date, '%Y' ) year_short,
      DATE_FORMAT( start_date, '%Y年' ) year_long,
      DAYOFWEEK( start_date ) day_of_week,
      DAYOFMONTH( start_date ) day_of_month,
      DAYOFYEAR( start_date ) day_of_year,
    CASE
        WHEN DAYOFWEEK( start_date )= 1 
        OR DAYOFWEEK( start_date )= 7 THEN
          1 ELSE 0 
        END is_holiday,
  '' description 
FROM
  DUAL
) t1
;
SET start_date = date_add( start_date, INTERVAL 1 DAY );
END WHILE;
END;
-- call  f_dim_date ('1970-01-02 00:00:00','1972-01-01 00:00:00');
CALL f_dim_date ( '1970-01-01 00:00:00', '2099-12-31 00:00:00' );