MYSQL事件使用 日期函数
目录
1.日期格式转换函数
DATE_FORMAT()
STR_TO_DATE()
CURDATE() 与 NOW()
DATE_ADD() 与 DATE_SUB()
DATEDIFF() 与 TIMESTAMPDIFF()
2.字符串函数
CONCAT()
SUBSTRING()
REPLACE()
LENGTH() 与 CHAR_LENGTH()
UPPER() 与 LOWER()
3.聚合函数
COUNT()
SUM()
AVG()
MAX() 与 MIN()
GROUP_CONCAT()常见场景与示例总结
1. 日期格式转换函数
MySQL 提供了多种日期相关的函数,可以方便地对日期进行格式化、计算时间差以及加减时间。以下是常用的日期格式转换函数。
1.1 DATE_FORMAT()
DATE_FORMAT() 函数用于将日期格式化为指定的字符串格式。常见的日期格式化规则包括:
%Y: 4位的年份(例如:2024)
%m: 2位的月份(01-12)
%d: 2位的日期(01-31)
%H: 2位的小时(00-23)
%i: 2位的分钟(00-59)
%s: 2位的秒(00-59)
示例:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;
结果:
formatted_date
-------------------
2024-09-13 14:35:21
1.2 STR_TO_DATE()
STR_TO_DATE() 将字符串解析为日期格式,通常用于从字符串中提取日期。
示例:
SELECT STR_TO_DATE('2024-09-13 14:35:21', '%Y-%m-%d %H:%i:%s') AS date_value;
结果:
date_value
-------------------
2024-09-13 14:35:21
1.3 CURDATE()、CURTIME() 与 NOW()
CURDATE() 返回当前日期(不包含时间部分)。
CURTIME()返回当前时间
NOW() 返回当前的日期和时间。
SELECT CURDATE() AS current_date, NOW() AS current_datetime;
结果:
current_date | current_datetime
----------------|-------------------
2024-09-13 | 2024-09-13 14:35:21
1.4 DATE_ADD() 与 DATE_SUB()
函数形式:DATE_ADD(date,INTERVAL expr unit) —— DATE_SUB(date,INTERVAL expr unit)
date_sub参数参考date_add即可。
expr:表示时间间隔值
unit:单位,如下
MICROSECOND 间隔单位:毫秒
SECOND 间隔单位:秒
MINUTE 间隔单位:分钟
HOUR 间隔单位:小时
DAY 间隔单位:天
WEEK 间隔单位:星期
MONTH 间隔单位:月
QUARTER 间隔单位:季度
YEAR 间隔单位:年
SECOND_MICROSECOND 复合型,间隔单位:秒、毫秒,expr可以用两个值来分别指定秒和毫秒
MINUTE_MICROSECOND 复合型,间隔单位:分、毫秒
MINUTE_SECOND 复合型,间隔单位:分、秒
HOUR_MICROSECOND 复合型,间隔单位:小时、毫秒
HOUR_SECOND 复合型,间隔单位:小时、秒
HOUR_MINUTE 复合型,间隔单位:小时分
DAY_MICROSECOND 复合型,间隔单位:天、毫秒
DAY_SECOND 复合型,间隔单位:天、秒
DAY_MINUTE 复合型,间隔单位:天、分
DAY_HOUR 复合型,间隔单位:天、小时
YEAR_MONTH 复合型,间隔单位:年、月
DATE_ADD() 用于在日期上增加指定的时间间隔。
DATE_SUB() 用于在日期上减去指定的时间间隔。
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS next_week;
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AS last_month;
结果:
next_week | last_month
----------------|------------
2024-09-20 | 2024-08-13
1.5 DATEDIFF() 与 TIMESTAMPDIFF()
DATEDIFF() 计算两个日期之间的天数差。
TIMESTAMPDIFF() 可计算任意单位的时间差(秒、分钟、小时、天等)。
SELECT DATEDIFF('2024-09-20', '2024-09-13') AS days_diff;
SELECT TIMESTAMPDIFF(HOUR, '2024-09-13 08:00:00', NOW()) AS hours_diff;
结果:
days_diff | hours_diff
------------|------------
7 | 6
1.6 转换日期
转换日期为对应格式
select day(now());获取当前的日数
select month(now());获取当前的月数
select year(now());获取当前的年数
select hour(now());获取当前的小时数
2. 字符串函数
字符串操作是数据库查询中常见的需求。MySQL 提供了丰富的字符串处理函数,用于连接、替换、截取和转换字符串。
2.1 CONCAT()
CONCAT() 函数用于将多个字符串连接成一个字符串。
SELECT CONCAT('Hello, ', 'World!') AS greeting;
使用字符串作为数据表名查询。
2.2使用字符串作为表名查询
SET @tablename =users ;
PREPARE StMt FROM 'SELECT * FROM ?';
SET @tablename =users
EXECUTE stmt USING @tablename;
DEALLOCATE PREPARE stmt;
2.3 SUBSTRING()
SUBSTRING() 函数用于截取字符串的子串。可以指定起始位置和长度。
SELECT SUBSTRING('abcdefg', 2, 3) AS sub_string;
结果:
sub_string
-----------
bcd
2.4REPLACE()
REPLACE() 函数用于将字符串中的指定子串替换为新的字符串。
SELECT REPLACE('Hello World', 'World', 'MySQL') AS replaced_string;
结果:
replaced_string
----------------
Hello MySQL
2.5 LENGTH() 与 CHAR_LENGTH()
LENGTH() 返回字符串的字节长度。
CHAR_LENGTH() 返回字符串的字符数(与字符编码相关)。
SELECT LENGTH('Hello') AS byte_length, CHAR_LENGTH('Hello') AS char_length;
结果:
byte_length | char_length
------------|------------
5 | 5
2.6 UPPER() 与 LOWER()
UPPER() 将字符串转换为大写,LOWER() 将字符串转换为小写。
SELECT UPPER('hello') AS upper_case, LOWER('HELLO') AS lower_case;
结果:
upper_case | lower_case
-----------|------------
HELLO | hello
3. 聚合函数
聚合函数用于对多行记录进行计算,常用于统计分析和报表生成。
3.1 COUNT()
COUNT() 用于计算查询结果的行数。
SELECT COUNT(*) AS total_rows FROM users;
结果:
total_rows
-----------
100
3.2 SUM()
SUM() 用于计算某列数值的总和。
SELECT SUM(salary) AS total_salary FROM employees;
结果:
total_salary
-------------
250000
3.3 AVG()
AVG() 用于计算某列数值的平均值。
SELECT AVG(salary) AS average_salary FROM employees;
结果:
average_salary
---------------
50000
3.4 MAX() 与 MIN()
MAX() 返回某列的最大值。
MIN() 返回某列的最小值。
SELECT MAX(salary) AS highest_salary, MIN(salary) AS lowest_salary FROM employees;
结果:
highest_salary | lowest_salary
---------------|---------------
100000 | 20000
3.5 GROUP_CONCAT()
GROUP_CONCAT() 用于将一组值连接成一个字符串,并以指定的分隔符分隔。
SELECT GROUP_CONCAT(username SEPARATOR ', ') AS user_list FROM users;
结果:
user_list
------------
alice, bob, charlie
4. 常见场景与示例
4.1 日期范围查询
假设你需要查询过去一个月内的订单:
SELECT * FROM orders
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE();
4.2 统计用户数量
统计每个部门的员工数量:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
4.3 合并用户姓名
假设你有一张用户表,想要将所有用户名拼接成一个字符串:
SELECT GROUP_CONCAT(username SEPARATOR ', ') AS all_usernames
FROM users;
5.定时任务事件语法
5.1开启事件功能
先检查是否开启事件功能:
show variables like 'event_scheduler';
如果’event_scheduler’的值为 'ON’表示调度器已开启,'OFF’为调度器未开启
开启事件:set global event_scheduler = on;
关闭事件:set global event_scheduler = off;
查看任务 SHOW EVENTS;
这个是查看现有任务,如果有任务只执行一次的话,执行之前是可以看到的,执行之后就没有了就查不到了。
5.2创建定时任务事件语法
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
时间有很多种的,
on schedule every 1 second -- 每秒执行1次 on schedule every 2 minute -- 每两分钟执行1次 on schedule every 3 day -- 每3天执行1次 ON schedule every 1 day starts date_add(date_add(curdate(), interval 1 day), interval 1 hour) -- 每天凌晨1点执行 ON schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour) -- 每个月的第一天凌晨1点执行 on schedule at current_timestamp()+interval 5 day -- 5天后执行 on schedule at current_timestamp()+interval 10 minute -- 10分钟后执行 on schedule at '2016-10-01 21:50:00' -- 在2016年10月1日,晚上9点50执行 ON schedule EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK -- 每 3 个月,从现在起一周后开始 ON schedule EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK -- 每十二个小时,从现在起三十分钟后开始,并于现在起四个星期后结束 on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month -- 5天后开始每天都执行执行到下个月底 on schedule every 1 day ends current_timestamp()+interval 5 day -- 从现在起每天执行,执行5天
举例:
创建一个1分钟后清空student_point表数据的事件 CREATE EVENT IF NOT EXISTS dsq1 on schedule at current_timestamp()+interval 1 minute -- 1分钟后执行 DO TRUNCATE TABLE student_point;
创建一个每天凌晨1点执行的任务 CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY STARTS date_add(date_add(curdate(), interval 1 day), interval 1 hour) ON COMPLETION PRESERVE DO -- 这里是任务的具体操作,可以是SQL语句或存储过程 INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2');
创建一个每隔3秒往test表中插入一条数据的事件 CREATE EVENT IF NOT EXISTS e_test_1 ON SCHEDULE EVERY 3 SECOND ON COMPLETION PRESERVE DO INSERT INTO test(id,t1) VALUES(NULL,NOW());
5.3查看全部事件
SHOW EVENTS;
5.4删除事件
DROP EVENT [IF EXISTS] event_name(事件名称);
例如:DROP EVENT event_name;
5.4使用事件实例
#查看事件 show events; #检查是否开启事件功能 show variables like 'event_scheduler'; #开启事件调度器 SET GLOBAL event_scheduler = ON; #每3分钟定时删除202309_log表 DELIMITER $$ CREATE EVENT IF NOT EXISTS dellog_event ON schedule every 3 minute starts date_add(now(),interval 3 minute) ON COMPLETION PRESERVE DO BEGIN SET @sql = CONCAT('drop table ',DATE_FORMAT(date_sub(curdate(),interval 1 month),'%Y%m'),'_log'); PREPARE stmt from @sql; execute stmt; DEALLOCATE PREPARE stmt; END$$ DELIMITER ;
参考:https://blog.csdn.net/fudaihb/article/details/142211537
https://www.cnblogs.com/qi-yuan-008/p/12782677.html
https://www.cnblogs.com/chaishengblog/p/18138557

浙公网安备 33010602011771号