mysql生成数仓时间维度表

-- 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;

猜你喜欢

转载自blog.csdn.net/laughing_yang/article/details/113777823