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
相关产品推荐
相关产品推荐

