-- 建表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' );