如何修改MySQL查询实现仅在指定时间段展示用户通知?
搞定SQL通知筛选的问题
嘿,我来帮你解决这个问题!你的原查询之所以返回所有数据,是因为没有添加筛选条件来限定当前日期必须落在允许查看通知的时间段内。咱们直接修改查询,加上WHERE子句就能实现需求啦。
修改后的完整查询语句
$Records = "SELECT *, DATE_FORMAT(end_date, '%d-%m-%Y') AS formatted_end_date, DATE_FORMAT(due_date, '%d-%m-%Y') AS formatted_due_date, ORG_NAME FROM vat_quarters LEFT JOIN organizations ON vat_quarters.org_id = organizations.org_id WHERE CURDATE() >= DATE_ADD(LAST_DAY(end_date), INTERVAL 11 DAY) AND CURDATE() <= due_date";
核心逻辑拆解
- 计算允许查看的起始日期:
DATE_ADD(LAST_DAY(end_date), INTERVAL 11 DAY)
这个表达式的作用是得到end_date次月的10日。举个例子:如果end_date是2018-02-01,LAST_DAY(end_date)会返回当月最后一天2018-02-28,再加11天就正好是2018-03-10,完全符合你的需求。 - 当前日期的校验:用
CURDATE()获取系统当前日期(只取日期部分,不含时间),然后判断它是否在「起始日期」和「due_date」之间,这样就能保证用户只能在允许的时间段内看到通知。 - 别名修改:我把原查询里的
end_date和due_date别名改成了formatted_end_date和formatted_due_date,避免和原始的日期字段重名(虽然MySQL允许使用别名,但这样写更清晰,能减少后续逻辑出错的概率)。
备选计算起始日期的方式
如果你觉得上面的表达式不够直观,也可以用另一种写法来计算次月10日:
DATE_FORMAT(DATE_ADD(end_date, INTERVAL 1 MONTH), '%Y-%m-10')
这个逻辑是先把end_date往后推1个月,再把日期固定为10号,结果和之前的方式完全一致,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者amit sutar
相关产品推荐
相关产品推荐

