Web投票系统:Cron每月重置投票,按日期筛选指定日数据的问题
解决每月筛选指定日期投票数据的问题
嘿,刚看到你的问题,作为正在学习Web开发的同学,遇到这个需求很正常,咱们一步步来搞定它!你要实现的核心是每月固定日期(比如当前是8月8日,就筛选所有月份8号添加的投票数据),然后配合Cron完成重置,下面分两部分讲具体实现:
一、数据库筛选指定日期的SQL写法
这是核心步骤,不同数据库的函数略有差异,我给你列两种最常用的:
1. MySQL/MariaDB 场景
用DAYOFMONTH()函数提取日期的“日”部分,直接对比当前日期的日就可以:
-- 筛选所有每月和当前日期同天创建的投票数据 SELECT * FROM votes WHERE DAYOFMONTH(created_at) = DAYOFMONTH(CURDATE()); -- 如果是重置票数(比如把票数置0),用UPDATE UPDATE votes SET vote_count = 0 WHERE DAYOFMONTH(created_at) = DAYOFMONTH(CURDATE()); -- 如果是直接删除历史数据,用DELETE DELETE FROM votes WHERE DAYOFMONTH(created_at) = DAYOFMONTH(CURDATE());
2. PostgreSQL 场景
用EXTRACT()函数提取日部分:
-- 筛选数据 SELECT * FROM votes WHERE EXTRACT(DAY FROM created_at) = EXTRACT(DAY FROM CURRENT_DATE); -- 重置票数 UPDATE votes SET vote_count = 0 WHERE EXTRACT(DAY FROM created_at) = EXTRACT(DAY FROM CURRENT_DATE);
注意边界情况
如果当前日期是月末(比如31号),有些月份没有31号(比如2月、4月等),这时候可以加个判断,比如如果当前是31号,就筛选日为31、30或者28/29的行?或者根据你的业务需求调整,比如只筛选存在的日期,避免漏掉数据。
二、配合Cron每月执行脚本
你需要把上面的SQL逻辑做成可执行的脚本(比如Python脚本调用数据库,或者直接用数据库的定时任务),然后配置Cron每月执行:
Cron表达式配置
如果要每月8号凌晨0点执行,Cron表达式是:
0 0 8 * *
解释:
- 第一个
0:分钟(0分) - 第二个
0:小时(0点,即凌晨) 8:日期(每月8号)- 第一个
*:月份(所有月份) - 第二个
*:星期(所有星期)
脚本示例(Python + MySQL)
如果你用Python写脚本,大概是这样:
import mysql.connector from mysql.connector import Error def reset_votes(): try: connection = mysql.connector.connect( host='your_host', database='your_db', user='your_user', password='your_password' ) if connection.is_connected(): cursor = connection.cursor() # 执行重置SQL reset_query = "UPDATE votes SET vote_count = 0 WHERE DAYOFMONTH(created_at) = DAYOFMONTH(CURDATE())" cursor.execute(reset_query) connection.commit() print(f"重置成功,影响了{cursor.rowcount}行数据") except Error as e: print(f"数据库操作出错:{e}") finally: if connection.is_connected(): cursor.close() connection.close() if __name__ == "__main__": reset_votes()
然后把这个脚本保存为reset_votes.py,给它加执行权限,再把Cron任务指向这个脚本就行。
额外提醒
- 时区问题:一定要保证服务器的时区和数据库的时区一致,不然日期判断会出错!比如服务器是UTC,数据库是东八区,那CURDATE()的结果会不一样。
- 测试先行:先手动执行脚本或者SQL,用测试数据验证筛选是否正确,比如把
CURDATE()换成固定日期(比如'2024-08-08'),看看能不能筛选出所有8号的行。
慢慢来,学习阶段遇到问题很正常,多测试多调试就搞定啦!
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

