alerts表查询targetDate超45天数据无结果的问题排查
解决你的SQL查询无结果问题
嘿,我来帮你拆解下为什么你的查询没返回数据,以及怎么修正它:
先看数据里的关键问题
你的alerts表中targetDate有两种情况,都是导致查询空结果的原因:
- 无效日期
0000-00-00:MySQL对这种无效日期用DATEDIFF()计算时会返回NULL,而NULL > 45的判断结果是不成立的,所以这类记录不会被选出来。 - 有效日期的时间差不够:看表中的有效
targetDate,比如2018-04-01、2018-05-01,假设你是在createDate对应的2018-05-02左右执行的查询,那2018-04-01和当天的天数差只有31天,远小于45天;剩下的有效日期都是未来的(比如2018-06-01、2018-08-01),这时候DATEDIFF(CURDATE(), targetDate)会得到负数,肯定不满足>45的条件。
给你几个修正后的查询选项
根据你的实际需求,选对应的语句:
1. 只筛选有效的、距今超45天的过去日期
如果0000-00-00是无效数据,想排除它们,用这个:
SELECT userID, refID, `targetDate` FROM alerts WHERE type = 'travelSoon' AND targetDate != '0000-00-00' AND DATEDIFF(CURDATE(), targetDate) > 45;
2. 把0000-00-00也视为符合条件的记录
如果这类无效日期需要被包含进来,就加个OR条件:
SELECT userID, refID, `targetDate` FROM alerts WHERE type = 'travelSoon' AND (targetDate = '0000-00-00' OR DATEDIFF(CURDATE(), targetDate) > 45);
另外补充一点:如果targetDate带时间部分,CURDATE()只取日期,DATEDIFF()会自动忽略时间差,这个是符合逻辑的,不用额外处理。
内容的提问来源于stack exchange,提问作者Roi
相关产品推荐
相关产品推荐

