本文档将在本地数据库中创建一个表格,在使用时请确保数据库配置完成,并使用命令USE选择所需创建表格的数据库。
这个数据库表格用于实现:每天自动进行一次记录文献阅读数量,如果没有手动写入,则为0.
本文档将完成:
在本地部署的MySQL数据库中创建一个表格:设置一个开始日期,比如三天前,然后它会自动生成三列,即id,日期,文献数量,其中文献数量默认值为0,也就是不阅读的话就是0,如果阅读了,则需要手动更改它的值,也就是说这份表格完全是自动生成,只有需要时才需要更改。程序应该实现这样的功能:在我使用这个表所在数据库的时候触发,检查当前日期,检查记录的日期(日期只要记录年月日即可),如果记录的日期已经记录到现在,就不做更改,如果记录的日期少于现在,就将剩下的日期补全,并将补全的日期中的literature_count设置为0。
创建数据库表格 literature_log
CREATE TABLE IF NOT EXISTS literature_log (
id INT AUTO_INCREMENT PRIMARY KEY, -- 自增 ID
record_date DATE NOT NULL, -- 记录的日期
literature_count INT DEFAULT 0 -- 文献数量,默认值为 0
);
创建存储过程 fill_missing_dates
DELIMITER //
CREATE PROCEDURE fill_missing_dates()
BEGIN
-- 声明变量
DECLARE current_day DATE;
DECLARE start_date DATE;
DECLARE last_record_date DATE;
-- 获取当前日期
SET current_day = CURDATE();
-- 设置开始日期为三天前
SET start_date = DATE_SUB(current_day, INTERVAL 3 DAY);
-- 获取表中最晚记录的日期
SELECT MAX(record_date) INTO last_record_date FROM literature_log;
-- 如果最晚记录日期小于开始日期,则从开始日期开始插入
IF last_record_date IS NULL OR last_record_date < start_date THEN
SET last_record_date = start_date;
END IF;
-- 如果最晚记录日期小于当前日期,则补全日期
WHILE last_record_date < current_day DO
SET last_record_date = DATE_ADD(last_record_date, INTERVAL 1 DAY);
-- 插入新的记录,literature_count 默认 0
INSERT INTO literature_log (record_date) VALUES (last_record_date);
END WHILE;
END //
DELIMITER ;
启用事件调度器(Event Scheduler)
确保 MySQL 的事件调度器已启用。这对于定时执行存储过程是必需的。
SET GLOBAL event_scheduler = ON;
创建事件 fill_missing_dates_event
接下来,创建一个事件 fill_missing_dates_event
,它将每天自动执行一次存储过程 fill_missing_dates()
,确保自动补全缺失的日期。
DELIMITER //
CREATE EVENT IF NOT EXISTS fill_missing_dates_event
ON SCHEDULE EVERY 1 DAY -- 每天执行一次
STARTS CURRENT_TIMESTAMP -- 从当前时间开始执行
DO
CALL fill_missing_dates(); -- 调用存储过程
//
DELIMITER ;
检查事件和存储过程的状态
执行完上述步骤后,检查存储过程和事件是否已经成功创建。
查看事件
SHOW EVENTS;
查看事件的详细信息
SHOW CREATE EVENT fill_missing_dates_event;
查看存储过程
SHOW PROCEDURE STATUS LIKE 'fill_missing_dates';
手动触发存储过程
如果你想手动触发存储过程以补全日期,可以使用以下命令:
CALL fill_missing_dates();
其他
有时候可能出现操作失误等出现报错,下面的命令可能很实用:
删除当前的存储过程和事件
-- 删除已存在的存储过程
DROP PROCEDURE IF EXISTS fill_missing_dates;
-- 删除已存在的事件
DROP EVENT IF EXISTS fill_missing_dates_event;
标签:dates,record,--,missing,计数,日期,MySql,date,文献
From: https://blog.csdn.net/Jay_Franklin/article/details/144640172