[MySQL] 创建间隔5分钟的时间表



间隔5分钟时间表,为了与其他表做联合查询时解决空缺时间点问题

方法一:创建存储过程,一次性插入N年的数据,每笔数据间隔5分钟


创建表

create table tb_date (date_day datetime());


创建存储过程

delimiter $

create procedure p1

begin 
declare i int;
declare j int;
declare time1 datetime;
set i = 3000;
set j = 1;
set time1 = now();
while i > 0
do
#insert into tb_minute_copy select now() - INTERVAL i*5 MINUTE;
insert into tb_minute_copy select time1 - INTERVAL i*5 MINUTE;

set i = i - 1;
end while;
while j < 5000000
do
insert into tb_minute_copy select time1 + INTERVAL j*5 MINUTE;
set j = j + 1;
end while;
end $




执行存储过程,写入数据

call p1();


方法二:用定时器,设定5分钟整数倍分钟时执行,每5分钟执行一次向表中插入当前时间

定时器执行语句

insert into tb_minute select now()

创建日历

创建日历表

CREATE TABLE `dim_date` (  
`date_id` int(11) NOT NULL COMMENT '20110512',  
`date_name` varchar(16) DEFAULT NULL COMMENT '2011-05-12',  
`date_of_month` int(11) DEFAULT NULL COMMENT '12',  
`year_id` int(11) DEFAULT NULL COMMENT '2011',  
`year_name` varchar(16) DEFAULT NULL COMMENT '2011年',  
`quarter_id` int(11) DEFAULT NULL COMMENT '2',  
`quarter_name` varchar(16) DEFAULT NULL COMMENT '2季度',  
`month_id` int(11) DEFAULT NULL COMMENT '5',  
`month_name` varchar(16) DEFAULT NULL COMMENT '5月',  
`month_of_year_name` varchar(16) DEFAULT NULL COMMENT '2011年5月',  
`month_of_year_id` int(11) DEFAULT NULL COMMENT '201105',  
`week_id` int(11) DEFAULT NULL,  
`week_name` varchar(16) DEFAULT NULL,  
`week_of_year_id` int(11) DEFAULT NULL,  
`week_of_year_name` varchar(32) DEFAULT NULL,  
`is_weekend` enum('否','是') DEFAULT NULL COMMENT '是否周末',  
PRIMARY KEY (`date_id`),  
KEY `ix_dim_date_date_name` (`date_name`),  
KEY `ix_dim_date_month_id` (`month_id`),  
KEY `ix_dim_date_year_id` (`year_id`),  
KEY `ix_dim_date_quanter_id` (`quarter_id`),  
KEY `ix_dim_date_week_of_year_id` (`week_of_year_id`,`week_of_year_name`)  
) ENGINE=MyISAM DEFAULT CHARSET=latin1  


创建存储过程
DROP PROCEDURE IF EXISTS pro_dim_date;  
CREATE PROCEDURE pro_dim_date(IN bdate DATE,IN edate DATE)  
BEGIN  
DECLARE var DATE DEFAULT bdate;  
DECLARE evar DATE DEFAULT DATE_ADD(edate,INTERVAL 1 DAY);  
DECLARE bweek DATE;  
DECLARE eweek DATE;  
WHILE var<evar DO  
SET bweek = DATE_ADD(DATE_SUB(var,INTERVAL 1 WEEK),INTERVAL 1 DAY);  
SET eweek = DATE_SUB(DATE_ADD(var,INTERVAL 1 WEEK),INTERVAL 1 DAY);  
INSERT INTO gyyx_report.dim_date   
(  
`date_id`,  
`date_name`,  
`date_of_month`,  
`year_id`,  
`year_name`,  
`quarter_id`,  
`quarter_name`,  
`month_id`,  
`month_name`,  
`month_of_year_name`,  
`month_of_year_id`,  
`week_id`,  
`week_name`,  
`week_of_year_id`,  
`week_of_year_name`,  
`is_weekend`  
)  
VALUES  
(  
DATE_FORMAT(var,'%Y%m%d'),  
DATE_FORMAT(var,'%Y-%m-%d'),  
DAYOFMONTH(var),  
YEAR(var),  
CONCAT(YEAR(var),'年'),  
QUARTER(var),  
CONCAT(QUARTER(var),'季度'),  
DATE_FORMAT(var,'%Y%m'),  
CONCAT(YEAR(var),'年',MONTH(var),'月'),  
CONCAT(MONTH(var),'月'),  
MONTH(var),  
WEEKDAY(var),  
CASE WEEKDAY(var) WHEN 0 THEN '星期一' WHEN 1 THEN '星期二' WHEN 2 THEN '星期三' WHEN 3 THEN '星期四' WHEN 4 THEN '星期五' WHEN 5 THEN '星期六' WHEN 6 THEN '星期日' END, 
WEEKOFYEAR(var),  
CONCAT('第',WEEKOFYEAR(var),'周(',MONTH(bweek),'月',DAY(bweek),'日~',MONTH(eweek),'月',DAY(eweek),'日'), 
CASE WHEN WEEKDAY(var)>4 THEN '是' ELSE '否' END   
);  
SET var=DATE_ADD(var,INTERVAL 1 DAY);  
END WHILE;  
END  


调用存储过程,填入日历表

call p7(NOW()-INTERVAL 31 DAY, NOW() + INTERVAL 10000 DAY)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值