做系统设计以及涉及数据分析的时候,会涉及到各种期间维度的统计计算。
可以按日期生成期间维度表,如下:
1.按期间生成日期表
DROP TABLE IF EXISTS `v_day`;
CREATE TABLE `v_day` (
`oc_date` varchar(20) DEFAULT NULL
);
2.调用方法为输入开始结束日期,生成期间的日期
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_gen_dates`$$
CREATE PROCEDURE `sp_gen_dates` (
param_begin_date VARCHAR (20),
param_end_date VARCHAR (20)
)
BEGIN
DECLARE cur_date,
end_date VARCHAR (20) ;
SET cur_date = DATE_FORMAT(param_begin_date, '%Y-%m-%d') ;
SET end_date = DATE_FORMAT(param_end_date, '%Y-%m-%d') ;
WHILE
cur_date < end_date DO
INSERT INTO v_day (oc_date)
VALUES
(cur_date) ;
SET cur_date = DATE_ADD(cur_date, INTERVAL 1 DAY) ;
END WHILE ;
END $$
DELIMITER ;
2.生成日期维度表
# time span
SET @d0 = "2012-01-01";
SET @d1 = "2035-12-31";
SET @date = DATE_SUB(@d0, INTERVAL 1 DAY);
# set up the time dimension table
DROP TABLE IF EXISTS time_dimension;
CREATE TABLE `time_dimension` (
`date` DATE DEFAULT NULL,
`id` INT NOT NULL,
`y` SMALLINT DEFAULT NULL,
`ym` INT DEFAULT NULL,
`m` SMALLINT DEFAULT NULL,
`d` SMALLINT DEFAULT NULL,
`yw` SMALLINT DEFAULT NULL,
`w` SMALLINT DEFAULT NULL,
`q` SMALLINT DEFAULT NULL,
`wd` SMALLINT DEFAULT NULL,
`m_name` CHAR(10) DEFAULT NULL,
`wd_name` CHAR(10) DEFAULT NULL,
PRIMARY KEY (`id`)
);
# populate the table with dates
INSERT INTO time_dimension
SELECT @date := DATE_ADD(@date, INTERVAL 1 DAY) AS DATE,
# integer ID that allowsimmediate understanding
DATE_FORMAT(@date, "%Y%m%d")AS id,
YEAR(@date) AS Y,
DATE_FORMAT(@date, '%Y%m') AS 'ym',
MONTH(@date) AS m,
DAY(@date) AS d,
DATE_FORMAT(@date, "%x")AS yw,
WEEK(@date, 3) AS w,
QUARTER(@date) AS q,
WEEKDAY(@date)+1 AS wd,
MONTHNAME(@date) AS m_name,
DAYNAME(@date) AS wd_name
FROM v_day
WHERE DATE_ADD(@date, INTERVAL 1 DAY) <= @d1
ORDER BY DATE;
SELECT * FROM time_dimension;