You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:12:40