自定义MySQL实用的函数和存储过程(持续更新)

目录

目标

功能列表

一键生成SQL

一键生成SQL(带驼峰式别名)

一键生成SQL(带驼峰式别名和字段注释)

根据表名称查询所有字段的备注

根据表注释查询相关表集合

根据字段注释查询相关表集合

随机返回子字符串

随机返回范围日期

时间戳+随机数

随机生成两个数范围内的数

生成Mybatis插入格式

生成Mybatis插入格式(含字段注释)

生成Mybatis修改格式

生成Mybatis修改格式(带判断标签)

根据table生成实体类

截取自定位置的字符串内容

增加字段&给表和字段加注释

枚举两个日期之间的天或小时

解锁被锁的表

批量产生分钟数据

批量产生小时数据


目标

简化MySQL日常开发,包括:自动生成测试数据、一键生成SQL、查询相关表集合等。


功能列表

一键生成SQL

功能说明:输入表名称,获取表的所有字段。

/*单表查询工具*/
DELIMITER $$
 
USE `数据库名字`$$
 
DROP FUNCTION IF EXISTS `one_table`$$
 
CREATE DEFINER=`数据库账号`@`%` FUNCTION `one_table`(one_table_name VARCHAR(1024)) RETURNS TEXT CHARSET utf8
BEGIN
    DECLARE result_sql VARCHAR(2048);
    SELECT  CONCAT('select ','\n', GROUP_CONCAT(COLUMN_NAME),'\n','from ','\n',one_table_name) INTO result_sql FROM information_schema.COLUMNS 
    WHERE  table_schema = DATABASE() AND table_name =one_table_name;
    
    RETURN result_sql;
    END$$
 
DELIMITER ;
/*两表查询工具*/
DELIMITER $$
 
USE `数据库名字`$$
 
DROP FUNCTION IF EXISTS `two_table`$$
 
CREATE DEFINER=`数据库账号`@`%` FUNCTION `two_table`(one_table_name VARCHAR(1024),two_table_name VARCHAR(1024)) RETURNS TEXT CHARSET utf8
BEGIN

    DECLARE result_sql TEXT;
SELECT CONCAT('select ','\n',GROUP_CONCAT(a.table_info,'\n'),'from ','\n',GROUP_CONCAT(a.table_name SEPARATOR ' inner join '),'\non \n') INTO result_sql FROM (
SELECT  CONCAT(one_table_name ,' a') table_name,CONCAT(GROUP_CONCAT('a.',COLUMN_NAME) ) table_info FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name = one_table_name
UNION ALL
SELECT  CONCAT(two_table_name, ' b') table_name,CONCAT(GROUP_CONCAT('b.',COLUMN_NAME) ) table_info FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name = two_table_name
)a ;

RETURN result_sql;
    END$$

调用&返回结果:

/*查询学生表的字段:*/
SELECT `one_table`('student')
/*返回结果:*/
SELECT 
id,student_name,sex,age
FROM 
student

/*关联学生表和家长表,查询所有字段:*/
SELECT `two_table`('student','parent_info')
/*返回结果:*/
SELECT 
a.id,a.student_name,a.sex,a.age
,b.id,b.parent_name,b.student_id
FROM 
student a INNER JOIN parent_info b
ON 

一键生成SQL(带驼峰式别名)

功能说明:输入表名称,获取表的所有字段,并给所有字段定义驼峰式别名。

DELIMITER $$

USE `数据库名称`$$

DROP FUNCTION IF EXISTS `create_bean`$$

CREATE DEFINER=`数据库账号`@`localhost` FUNCTION `create_bean`(var_string TEXT) RETURNS TEXT CHARSET utf8mb4
    DETERMINISTIC
BEGIN
DECLARE var_mysql_string TEXT;
DECLARE var_mybatis_string TEXT;
SELECT  
CONCAT(GROUP_CONCAT(
IF(
LOCATE('_',var_string) > 0
,
CONCAT(
/*头部*/
LEFT(var_string,INSTR(var_string,'_')-1),
/*中部(要修改)*/
UPPER(
SUBSTRING(var_string,INSTR(var_string,'_')+1,1)
),
/*尾部*/
SUBSTRING(var_string,INSTR(var_string,'_')+2)),
var_string
))) 
INTO @a;
    
WHILE LOCATE('_',@a) > 0 DO 
SELECT 
CONCAT(
/*头部*/
LEFT(@a,INSTR(@a,'_')-1),
/*中部(要修改)*/
UPPER(
SUBSTRING(@a,INSTR(@a,'_')+1,1)
),
/*尾部*/
SUBSTRING(@a,INSTR(@a,'_')+2)
) INTO @a; 
END WHILE;

RETURN @a;
    
    END$$

DELIMITER ;
DELIMITER $$

USE `数据库名称`$$

DROP FUNCTION IF EXISTS `other_table_name`$$

CREATE DEFINER=`数据库账号`@`localhost` FUNCTION `other_table_name`(var_table_name TEXT) RETURNS TEXT CHARSET utf8mb4
    DETERMINISTIC
BEGIN
    
SELECT 
CONCAT('select ','\n', GROUP_CONCAT('`',a.COLUMN_NAME,'` ' ,create_bean(b.COLUMN_NAME) SEPARATOR ','),'\n','from ','\n',var_table_name)
INTO @a
FROM 
(
SELECT COLUMN_NAME
FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =var_table_name
)a , 
(
SELECT COLUMN_NAME
FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =var_table_name
)b 
WHERE a.COLUMN_NAME=b.COLUMN_NAME;
RETURN @a;
    END$$

DELIMITER ;

调用&返回结果:

#调用
SELECT other_table_name('student');
#返回结果
select 
id id,stu_name stuName,stu_age stuAge,stu_sex stuSex
from 
student

一键生成SQL(带驼峰式别名和<!---->字段注释)

功能说明:输入表名称,获取表的所有字段,并给所有字段定义驼峰式别名和字段注释(如果字段有注释)。

DELIMITER $$

USE `数据库名称`$$

DROP FUNCTION IF EXISTS `other_table_name_details`$$

CREATE DEFINER=`账号`@`localhost` FUNCTION `other_table_name_details`(var_table_name TEXT) RETURNS TEXT CHARSET utf8mb4
    DETERMINISTIC
BEGIN
    
SELECT 
CONCAT('select ', GROUP_CONCAT(
IF(column_comment IS NULL OR column_comment ='' , '', CONCAT('\n','<!--',column_comment,'-->')),
'\n`',a.COLUMN_NAME,'` ' ,create_bean(b.COLUMN_NAME) SEPARATOR ','),'\n','from ','\n',var_table_name)
 INTO @a
FROM 
(
SELECT COLUMN_NAME,column_comment
FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =var_table_name
)a , 
(
SELECT COLUMN_NAME
FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =var_table_name
)b 
WHERE a.COLUMN_NAME=b.COLUMN_NAME;    
    
RETURN @a;
    END$$

DELIMITER ;

调用&返回结果:

/*调用*/
SELECT other_table_name_details('b_pay_steplog')
/*返回结果*/
select 
loguid loguid,
entvesion entvesion,
entcode entcode,
extappid extappid,
buid buid,
storeuid storeuid,
<!--支付类型,0微信支付(默认)1储值卡支付-->
paytype paytype,
<!--交易状态-1失败,0支付中,1支付成功-->
state state,
dt dt,
<!--支付通道(0:原生微信,1:小智微信,2:先锋代扣)-->
paysource paysource,
<!--附加数据-->
attach attach,
<!--第三方商户订单号-->
srefno srefno,
<!--商户订单号-->
outtradeno outtradeno,
<!--业务状态(表示支付对应的业务是否已发生业务中心处理完毕) 0 未处理 1已处理-->
businessType businessType
from 
b_pay_steplog

根据表名称查询所有字段的备注

功能说明:输入表的名称,获取相关表字段的备注。

CREATE DEFINER=`账号`@`localhost` PROCEDURE `select_t_comment`(var_table_name TEXT)
BEGIN
    SELECT COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT,COLUMN_KEY
    FROM information_schema.COLUMNS 
    WHERE  table_schema = DATABASE() AND table_name =var_table_name
    ORDER BY COLUMN_KEY DESC,COLUMN_NAME;
END

调用&返回结果:

CALL `select_t_comment`('soil_land_agriculture')


根据表注释查询相关表集合

功能说明:输入表的注释信息,获取相关表的集合。

DELIMITER $$
 
USE `数据库名称`$$
 
DROP PROCEDURE IF EXISTS `table_comment`$$
 
CREATE DEFINER=`数据库账号`@`%` PROCEDURE `table_comment`(param_table_name VARCHAR(1024) CHARSET 'utf8mb4')
BEGIN
IF param_table_name IS NOT NULL  AND LENGTH(REPLACE(param_table_name,' ',''))>0
THEN
SELECT
    TABLE_NAME 表名称,
    TABLE_COMMENT 表备注
FROM
    information_schema.`TABLES`
WHERE
    TABLE_SCHEMA = DATABASE() AND TABLE_COMMENT LIKE CONCAT('%',param_table_name,'%') ORDER BY TABLE_NAME;
ELSE
SELECT
    TABLE_NAME 表名称,
    TABLE_COMMENT 表备注
FROM
    information_schema.`TABLES`
WHERE
    TABLE_SCHEMA = DATABASE()  ORDER BY TABLE_NAME;
END IF;
    END$$
 
DELIMITER ;
/*给表加上注释:*/
ALTER TABLE `parent_info`  COMMENT='家长信息表';
ALTER TABLE `student` COMMENT='学生信息表';
ALTER TABLE `student_grade` COMMENT='学生成绩表';

调用&返回结果:

/*查询所有表信息:*/
CALL `table_comment`(NULL)

/*查询和学生有关的表信息:*/
CALL `table_comment`('学生')


根据字段注释查询相关表集合

功能说明:输入字段的注释信息,获取相关表的集合。

DELIMITER $$
 
USE `数据库名称`$$
 
DROP PROCEDURE IF EXISTS `t_col`$$
 
CREATE DEFINER=`数据库账号`@`%` PROCEDURE `t_col`(param_column_name VARCHAR(1024) CHARSET 'utf8mb4')
BEGIN
SELECT DISTINCT a.table_name 表名称,b.TABLE_COMMENT 表备注
FROM information_schema.COLUMNS a ,information_schema.`TABLES` b 
WHERE  a.table_schema = DATABASE() AND a.table_name=b.table_name AND a.column_comment LIKE CONCAT('%',param_column_name,'%');
    END$$
 
DELIMITER ;

调用&返回结果:

/*查询字段注释信息中包含'性别'的表集合:*/
CALL t_col('性别');


随机返回子字符串

功能说明:输入以英文逗号分隔的数据,随机返回一个子字符串。

DELIMITER $$
 
USE `数据库名字`$$
 
DROP FUNCTION IF EXISTS `rand_string`$$
 
CREATE DEFINER=`数据库账号`@`%` FUNCTION `rand_string`(var_string TEXT) RETURNS TEXT CHARSET utf8
BEGIN
/*根据逗号分隔字符串,统计有多少个字符串。*/
SET @num= LENGTH(var_string)-LENGTH(REPLACE(var_string,',',''))+1;
/*随机生成位置*/
SET @index= FLOOR(RAND()*@num)+1;
/*开始截取*/
SET @rand_start =SUBSTRING_INDEX(var_string,',',@index);
SET  @rand_end =SUBSTRING_INDEX(@rand_start,',',-1);
RETURN @rand_end ;
    END$$
 
DELIMITER ;

调用&返回结果:

/*随机返回姓名,以英文逗号分隔。*/
SELECT `rand_string`('Tom,Mark,Tony,Green')

随机返回范围日期

功能说明:输入两个日期,随机生成这两个日期之间的一个日期。

DELIMITER $$
 
USE `数据库名称`$$
 
DROP FUNCTION IF EXISTS `create_time`$$
 
CREATE DEFINER=`数据库账号`@`%` FUNCTION `create_time`(start_time VARCHAR(10),end_time VARCHAR(10) ) RETURNS VARCHAR(36) CHARSET utf8
BEGIN
  /*两个日期之差*/
   DECLARE num INT(4) DEFAULT ABS(DATEDIFF(start_time, end_time));
   DECLARE rand_date DATE DEFAULT DATE_ADD(start_time,INTERVAL FLOOR(RAND()*num) DAY);
    RETURN CONCAT(
rand_date,' ',
/*随机时*/
 LPAD(FLOOR(RAND()*24),2, 0),':',
/*随机分*/
 LPAD(FLOOR(RAND()*60),2, 0),':',
/*随机秒*/
 LPAD(FLOOR(RAND()*60),2, 0)
);
    END$$
 
DELIMITER ;

调用&返回结果:

/*随机生成一个范围日期:*/
SELECT create_time('2020-01-20','2020-01-09') rand_time

时间戳+随机数

/*毫秒级别时间戳+5位随机数*/
SELECT 
CONCAT(REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)),'.',''),LPAD(FLOOR(RAND()*(100000)),5, 0))  order_number ;

随机生成两个数范围内的数

功能说明:输入两个整数,随机生成范围数据。

调用&返回结果:

/*[a,b]的范围整数*/
SELECT FLOOR(b + (RAND() * (a-b+1)));

生成Mybatis插入格式

功能说明:输入表名,生成dao层的插入映射。

DELIMITER $$

USE `数据库`$$

DROP FUNCTION IF EXISTS `insert_dao`$$

CREATE DEFINER=`数据库账号`@`%` FUNCTION `insert_dao`(param_table_name TEXT) RETURNS TEXT CHARSET utf8mb4
BEGIN
DECLARE var_mysql_string TEXT;
DECLARE var_mybatis_string TEXT;
SELECT  CONCAT('insert into  ',param_table_name,'\n', '(',GROUP_CONCAT(COLUMN_NAME),'\n',')values( ','\n') INTO var_mysql_string FROM information_schema.COLUMNS WHERE  table_schema = DATABASE() AND table_name =param_table_name;
SELECT  
CONCAT(GROUP_CONCAT(
IF(
LOCATE('_',COLUMN_NAME) > 0
,
CONCAT(
/*头部*/
LEFT(COLUMN_NAME,INSTR(COLUMN_NAME,'_')-1),
/*中部(要修改)*/
UPPER(
SUBSTRING(COLUMN_NAME,INSTR(COLUMN_NAME,'_')+1,1)
),
/*尾部*/
SUBSTRING(COLUMN_NAME,INSTR(COLUMN_NAME,'_')+2)),
COLUMN_NAME
))) 
INTO @a
  FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =param_table_name;
    
WHILE LOCATE('_',@a) > 0 DO 
SELECT 
CONCAT(
/*头部*/
LEFT(@a,INSTR(@a,'_')-1),
/*中部(要修改)*/
UPPER(
SUBSTRING(@a,INSTR(@a,'_')+1,1)
),
/*尾部*/
SUBSTRING(@a,INSTR(@a,'_')+2)
) INTO @a; 
END WHILE;
SET var_mybatis_string= CONCAT('#{',REPLACE(@a,',','},#{'),'}','\n',');') ;
RETURN CONCAT(var_mysql_string,var_mybatis_string);
    END$$

DELIMITER ;

调用&返回结果:

/*生成member_up_level表的映射。*/
SELECT insert_dao('member_up_level');

/*返回结果。*/
insert into  member_up_level
(id,create_time,member_id,before_up_level,after_up_level,up_level_type
)values( 
#{id},#{createTime},#{memberId},#{beforeUpLevel},#{afterUpLevel},#{upLevelType}
);

生成Mybatis插入格式(含字段注释)

功能说明:输入表名,生成dao层的插入映射,如果数据库字段有注释,则展示字段注释。

DELIMITER $$

USE `数据库名称`$$

DROP FUNCTION IF EXISTS `insert_dao_details`$$

CREATE DEFINER=`账号`@`%` FUNCTION `insert_dao_details`(param_table_name TEXT) RETURNS TEXT CHARSET utf8mb4
BEGIN
DECLARE var_mysql_string TEXT;
DECLARE var_mybatis_string TEXT;

SELECT  CONCAT('insert into  ',
param_table_name, '(',GROUP_CONCAT(
IF(column_comment IS NULL OR column_comment ='','',
CONCAT('\n','<!--',column_comment,'-->')
),
'\n',COLUMN_NAME),'\n',')values( ','\n')  INTO var_mysql_string  FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =param_table_name;

SELECT  
CONCAT(GROUP_CONCAT(
IF(
LOCATE('_',COLUMN_NAME) > 0
,
CONCAT(
/*头部*/
LEFT(COLUMN_NAME,INSTR(COLUMN_NAME,'_')-1),
/*中部(要修改)*/
UPPER(
SUBSTRING(COLUMN_NAME,INSTR(COLUMN_NAME,'_')+1,1)
),
/*尾部*/
SUBSTRING(COLUMN_NAME,INSTR(COLUMN_NAME,'_')+2)),
COLUMN_NAME
))) 
INTO @a
  FROM information_schema.COLUMNS 
WHERE  table_schema = DATABASE() AND table_name =param_table_name;
    
WHILE LOCATE('_',@a) > 0 DO 
SELECT 
CONCAT(
/*头部*/
LEFT(@a,INSTR(@a,'_')-1),
/*中部(要修改)*/
UPPER(
SUBSTRING(@a,INSTR(@a,'_')+1,1)
),
/*尾部*/
SUBSTRING(@a,INSTR(@a,'_')+2)
) INTO @a; 
END WHILE;
SET var_mybatis_string= CONCAT('#{',REPLACE(@a,',','},#{'),'}','\n',');') ;
RETURN CONCAT(var_mysql_string,var_mybatis_string);
    END$$

DELIMITER ;

调用&返回结果:

/*生成member_up_level表的映射。*/
SELECT insert_dao_details('b_pay_steplog')

/*返回结果。*/
insert into  b_pay_steplog(
loguid,
entvesion,
entcode,
extappid,
buid,
storeuid,
<!--支付类型,0微信支付(默认)1储值卡支付-->
paytype,
<!--交易状态-1失败,0支付中,1支付成功-->
state,
dt,
<!--支付通道(0:原生微信,1:小智微信,2:先锋代扣)-->
paysource,
<!--附加数据-->
attach,
<!--第三方商户订单号-->
srefno,
<!--商户订单号-->
outtradeno,
<!--业务状态(表示支付对应的业务是否已发生业务中心处理完毕) 0 未处理 1已处理-->
businessType
)values( 
#{loguid},#{entvesion},#{entcode},#{extappid},#{buid},#{storeuid},#{paytype},#{state},#{dt},#{paysource},#{attach},#{srefno},#{outtradeno},#{businessType}
);

生成Mybatis修改格式

功能说明:输入表名和库名,生成Mybatis修改SQL。

SELECT CONCAT('UPDATE \n',table_name,'\nSET ', column_list, '\nWHERE condition;') AS update_statement
FROM (
  SELECT GROUP_CONCAT(CONCAT( '\n' ,column_name, ' = ', '#{',`create_bean`(column_name),'}') SEPARATOR ', ') 
  AS column_list,table_name
  FROM information_schema.columns 
  WHERE table_schema = DATABASE() AND table_name = '表名称'
) AS COLUMNS;

调用&返回结果:

UPDATE 
traffic_source_site_his
SET 
id = #{id}, 
site_code = #{siteCode}, 
monitor_time = #{monitorTime}, 
create_time = #{createTime}, 
update_time = #{updateTime}, 
only_key = #{onlyKey}, 
a25020 = #{a25020}, 
a25506 = #{a25506}, 
a25503 = #{a25503}, 
a24517 = #{a24517}, 
a24516 = #{a24516}
WHERE condition;

生成Mybatis修改格式(带判断标签)

功能说明:输入表名和库名,生成Mybatis修改SQL。

SELECT CONCAT('UPDATE \n',table_name,'\n<set> ', column_list, '\n</set>\nWHERE condition;') AS update_statement
FROM (
  SELECT GROUP_CONCAT(
  "\n	<if test='",`create_bean`(column_name)," != null "," and ",`create_bean`(column_name)," !=\"\"'>",
  CONCAT( '\n	' ,column_name, ' = ', '#{',`create_bean`(column_name),'},'  ) ,
  "\n	</if>" SEPARATOR ''
  ) 
  AS column_list,table_name
  FROM information_schema.columns 
  WHERE table_schema = DATABASE() AND table_name = '表名称'
) AS COLUMNS;

调用&返回结果:

UPDATE 
traffic_source_site_his
<set> 
	<if test='id != null  and id !=""'>
	id = #{id},
	</if>
	<if test='siteCode != null  and siteCode !=""'>
	site_code = #{siteCode},
	</if>
	<if test='monitorTime != null  and monitorTime !=""'>
	monitor_time = #{monitorTime},
	</if>
	<if test='createTime != null  and createTime !=""'>
	create_time = #{createTime},
	</if>
</set>
WHERE condition;

根据table生成实体类

功能说明:输入表名,生成JAVA Bean对象。

DELIMITER $$

USE `数据库名`$$

DROP FUNCTION IF EXISTS `create_bean`$$

CREATE DEFINER=`数据库登录名`@`%` FUNCTION `create_bean`(param_table_name VARCHAR(1024)) RETURNS TEXT CHARSET utf8
BEGIN
SELECT 
GROUP_CONCAT('//',COLUMN_COMMENT,'\n','private ',
CASE DATA_TYPE
		WHEN 'bigint' THEN
			"Long"
		WHEN 'decimal' THEN
			'BigDecimal'
		WHEN 'date' THEN
		'Date'
		WHEN 'datetime' THEN
		'Date'
		WHEN 'varchar' THEN
		'String'
		WHEN 'int' THEN
		'Integer/Long'
		ELSE
		'null'
		END 
,' ',
 COLUMN_NAME  
SEPARATOR ';\n') INTO @a
FROM information_schema.COLUMNS WHERE  table_schema = DATABASE() AND table_name =param_table_name;
WHILE LOCATE('_',@a) > 0 DO 
SELECT 
CONCAT(
#头部
LEFT(@a,INSTR(@a,'_')-1),
#中部(要修改)
UPPER(
SUBSTRING(@a,INSTR(@a,'_')+1,1)
),
#尾部
SUBSTRING(@a,INSTR(@a,'_')+2)
) INTO @a; 
END WHILE;
RETURN CONCAT(@a,';');
    END$$

DELIMITER ;

调用&返回结果:

/*生成investment_order表的映射。*/
SELECT create_bean('investment_order');

/*返回结果。*/

//主键
private Integer/Long id;
//订单号
private String orderNo;
//投资金额
private BigDecimal investmentAmount;
//静态收益
private BigDecimal staticIncome;
//最近一次的静态收益
private BigDecimal staticIncomeLately;
//会员ID
private Integer/Long memberId;
//0、正常;1、销毁
private Integer/Long orderStatus;

截取自定位置的字符串内容

功能说明:输入分隔符的位置,截取指定内容。

/*n表示第n个和第n-1个分隔符前面的内容。*/
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('字符串内容', ',', n), ',', -1) msg

调用&返回结果:

/*案例如下,将输出777。*/
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('111,222,333,444,555,666,777,888,999,000', ',', 7), ',', -1) msg

增加字段&给表和字段加注释

功能说明:给表和字段加注释,给表增加字段。

/*给列加注释*/
ALTER TABLE 表名称 MODIFY 表字段 VARCHAR(255) NULL COMMENT '字段注释' ;
/*给表加注释*/
ALTER TABLE 表名称 COMMENT='表注释'; 
/*给表增加一列并给它加上注释*/
ALTER TABLE 表名称 ADD COLUMN 表字段 VARCHAR(255) DEFAULT NULL COMMENT '字段注释';
ALTER TABLE 表名称 ADD COLUMN 表字段 VARCHAR(255) DEFAULT '' NOT NULL COMMENT '字段注释';

枚举两个日期之间的天或小时

功能说明:给定开始时间和结束时间,枚举这两个日期之间的所有天或小时。

DELIMITER $$

USE `gll`$$

DROP PROCEDURE IF EXISTS `date_list`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `date_list`(start_time VARCHAR(10),end_time VARCHAR(10),date_type VARCHAR(1))
BEGIN
DECLARE var_i INT(10);
DECLARE var_date_num INT(10);
DECLARE var_date TEXT;
SET var_i=0;
SET var_date="";

IF 
date_type='d'
THEN
SET var_date_num= DATEDIFF(end_time, start_time) ;
ELSE
SET var_date_num= (DATEDIFF(end_time, start_time)+1) *24-1 ;
END IF;
	
WHILE var_i<=var_date_num  DO 
IF 
date_type='d'
THEN
SET var_date=CONCAT(
	var_date,
	DATE_ADD(start_time,INTERVAL var_i DAY),
	'\n'
	);
ELSE
SET var_date=CONCAT(
	var_date,
	DATE_ADD(start_time,INTERVAL var_i HOUR),
	'\n'
	);
END IF;
SET var_i=var_i+1;
END WHILE;
	
SELECT var_date;
	END$$

DELIMITER ;

枚举小时列表

CALL date_list('2022-08-10','2022-08-10','');

结果

2022-08-10 00:00:00
2022-08-10 01:00:00
2022-08-10 02:00:00
2022-08-10 03:00:00
2022-08-10 04:00:00
2022-08-10 05:00:00
2022-08-10 06:00:00
2022-08-10 07:00:00
2022-08-10 08:00:00
2022-08-10 09:00:00
2022-08-10 10:00:00
2022-08-10 11:00:00
2022-08-10 12:00:00
2022-08-10 13:00:00
2022-08-10 14:00:00
2022-08-10 15:00:00
2022-08-10 16:00:00
2022-08-10 17:00:00
2022-08-10 18:00:00
2022-08-10 19:00:00
2022-08-10 20:00:00
2022-08-10 21:00:00
2022-08-10 22:00:00
2022-08-10 23:00:00

枚举天列表

CALL date_list('2022-08-01','2022-08-10','d');

结果

2022-08-01
2022-08-02
2022-08-03
2022-08-04
2022-08-05
2022-08-06
2022-08-07
2022-08-08
2022-08-09
2022-08-10

解锁被锁的表

SELECT * FROM information_schema.`PROCESSLIST` 
#持续时间(选填)
WHERE `time` > 1000 
#sql执行的账号(选填)
AND `user` = 'root' 
#数据库名称(选填)
AND db='epdp_lyg' 
#表名称(选填)
AND info LIKE '%sop_pam_water_hour%'
#根据时间排序
ORDER BY `time` DESC;

#终止目标sql的进程
KILL id;

批量产生分钟数据

/*创建表*/
CREATE TABLE `minute_list` (
  `min_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`min_time`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

/*创建存储过程*/
DELIMITER $$

USE `数据库名称`$$

DROP PROCEDURE IF EXISTS `insert_min_list`$$

CREATE DEFINER=`登录账号`@`localhost` PROCEDURE `insert_min_list`(start_time VARCHAR(10),end_time VARCHAR(10),date_type VARCHAR(10))
BEGIN
DECLARE var_i INT(10) DEFAULT 0;
DECLARE var_min_time VARCHAR(20) DEFAULT "";
DECLARE var_date_num INT(10);
 

SET var_date_num= TIMESTAMPDIFF(MINUTE,start_time,ADDDATE(end_time,INTERVAL 1 DAY)) ;

WHILE var_i<var_date_num  DO 

SELECT min_time INTO var_min_time FROM minute_list WHERE min_time=ADDDATE(start_time,INTERVAL var_i MINUTE);
IF var_min_time =""
THEN 
INSERT INTO minute_list (min_time)VALUES(ADDDATE(start_time,INTERVAL var_i MINUTE));
END IF;

SET var_min_time ="";
SET var_i=var_i+1;
END WHILE;
	END$$

DELIMITER ;

/*调用(录入2023-02-20这一整天的1440个分钟周期)*/
CALL `insert_min_list`("2023-02-20","2023-02-20",NULL);

结果


批量产生小时数据

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `数据库名称`.`insert_hour_list`(start_time VARCHAR(10),end_time VARCHAR(10))
BEGIN
DECLARE var_i INT(10) DEFAULT 0;
DECLARE var_interval INT(10) DEFAULT 0;
DECLARE var_hour_time VARCHAR(20) DEFAULT "";
DECLARE var_date_num INT(10);
 

SET var_date_num= TIMESTAMPDIFF(HOUR,start_time,ADDDATE(end_time,INTERVAL 1 DAY));

WHILE var_i<var_date_num  DO 

SELECT hour_time INTO var_hour_time FROM hour_list WHERE hour_time=ADDDATE(start_time,INTERVAL var_interval HOUR);
IF var_hour_time =""
THEN 
INSERT INTO hour_list (hour_time)VALUES(ADDDATE(start_time,INTERVAL var_interval HOUR));
END IF;

SET var_hour_time ="";
SET var_i=var_i+1;
SET var_interval=var_interval+1;
END WHILE;
	END$$

DELIMITER ;

/*向hour_list表插入2023-02-28这一天24小时的数据*/
CALL insert_hour_list("2023-02-28","2023-02-28");

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值