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

CodeIgniter中截止日前1个月当日提醒的MySQL查询问题

解决CodeIgniter中截止日期提前1个月通知的日期匹配问题

嘿,我一眼就看到问题出在哪啦!你用的NOW()函数会返回包含时分秒的完整时间戳(比如 2018-01-13 15:20:30),但DATE_SUB(deadline, INTERVAL 1 MONTH)生成的是纯日期格式(比如 2018-01-13),两者类型不匹配,自然没法相等匹配。

修正方案

我们只需要把时间匹配改成纯日期匹配就行,有两种简单的方式:

方法1:用CURDATE()替代NOW()

CURDATE()只返回当前系统日期(不带时分秒),完美匹配DATE_SUB生成的日期结果:

SELECT *, DATE_SUB(deadline, INTERVAL 1 MONTH) as alert_now 
FROM notif 
WHERE CURDATE() = DATE_SUB(deadline, INTERVAL 1 MONTH)

方法2:统一转换为日期格式(兼容带时间的deadline)

如果你的deadline字段可能存储了带时分秒的时间,那可以把两边都转成纯日期格式来匹配:

SELECT *, DATE_SUB(deadline, INTERVAL 1 MONTH) as alert_now 
FROM notif 
WHERE DATE(NOW()) = DATE(DATE_SUB(deadline, INTERVAL 1 MONTH))

更新后的CodeIgniter模型代码

另外注意,你之前的代码直接返回了查询对象,建议在模型里直接返回结果集,方便控制器调用:

public function notification(){
    $query = $this->db->query('
        SELECT *, DATE_SUB(deadline, INTERVAL 1 MONTH) as alert_now 
        FROM notif 
        WHERE CURDATE() = DATE_SUB(deadline, INTERVAL 1 MONTH)
    ');
    return $query->result(); // 返回对象数组,也可以用result_array()返回关联数组
}

额外说明

关于边界日期(比如截止日是31号的情况):MySQL的DATE_SUB会自动处理月份天数差异,比如2018-03-31减1个月会得到2018-02-28(非闰年),如果当日正好是2018-02-28,这条记录会被正常匹配,这符合“提前1个月通知”的业务逻辑哦。

内容的提问来源于stack exchange,提问作者Andrea Sha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:31