-- 1.生成临时表
DROP TABLE IF EXISTS T ;
CREATE TABLE `T` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '临时表';
DROP PROCEDURE IF EXISTS init_data_T;
CREATE PROCEDURE init_data_T(num INT)
BEGIN
DECLARE id INT;
SET id=1;
WHILE id <= num DO
INSERT INTO T VALUES(id);
SET id = id + 1;
END WHILE;
END;
-- 参数表示临时表T的行数,大于要生成日期的天数即可
CALL init_data_T(1000);
-- 2.生成数仓时间维度表
DROP TABLE IF EXISTS time_dimension ;
CREATE TABLE `time_dimension` (
`date` date DEFAULT NULL ,
`date_id` INT NOT NULL COMMENT '日',
`week_id` SMALLINT DEFAULT NULL COMMENT '周',
`week_day` SMALLINT DEFAULT NULL COMMENT '周的第几天',
`day` SMALLINT DEFAULT NULL COMMENT '每月的第几天',
`month` SMALLINT DEFAULT NULL COMMENT '第几月',
`quarter` SMALLINT DEFAULT NULL COMMENT '第几季度',
`year` SMALLINT DEFAULT NULL COMMENT '年',
`is_workday` SMALLINT DEFAULT NULL COMMENT '是否工作日',
PRIMARY KEY (`date_id`)
);
SET @d0 = "2021-01-01";
SET @d1 = "2022-01-01";
SET @date = DATE_SUB(@d0, INTERVAL 1 DAY);
INSERT INTO time_dimension
SELECT
@date := DATE_ADD(@date, INTERVAL 1 DAY) AS DATE,
DATE_FORMAT(@date, "%Y%m%d") AS date_id,
WEEK(@date,3) AS week_id,
WEEKDAY(@date) + 1 AS week_day,
DAYOFMONTH(@date) AS `day`,
MONTH(@date) AS `month`,
QUARTER(@date) AS `quarter`,
YEAR(@date) AS `year`,
CASE WHEN WEEKDAY(@date) + 1 <=5 THEN 1 ELSE 0 END AS is_workday
FROM
T
WHERE DATE_ADD(@date, INTERVAL 1 DAY) <= @d1
ORDER BY DATE ;
-- 4.删除临时表
DROP TABLE IF EXISTS T ;
DROP PROCEDURE IF EXISTS init_data_T;