MySQL查询到期日距今日30天内的数据失败求助
解决你的SQL查询问题
看来你的查询语句有几个关键问题导致无法正常运行,我来帮你拆解修复:
原查询的核心错误
- BETWEEN子句语法错误:BETWEEN的正确用法是
字段 BETWEEN 值1 AND 值2,你用括号把两个值括起来的写法不符合MySQL语法,而且还漏掉了闭合括号,这会直接触发语法报错。 - 日期计算逻辑颠倒:你要找的是「到期日距今日30天内」的数据,也就是到期日落在今日到今日往后30天的区间里。但你用了
DATE_SUB(expiration_date, INTERVAL 30 DAY),这是把到期日往前推30天,逻辑完全搞反了,应该用DATE_ADD()来计算今日之后的30天。 - SQL注入风险:直接把变量
$date_today拼接到SQL语句里是不安全的,容易被注入攻击,建议用预处理语句来规避这个问题。
修复后的查询语句
基础修复版(先保证逻辑正确)
首先修正语法和逻辑,假设你的日期字段expiration_date是DATE类型(如果是字符串类型,建议先转换成DATE类型,避免格式匹配问题):
$date_today = '04-28-2018'; // 修正语法与日期计算逻辑 $query = "SELECT * FROM registration WHERE expiration_date BETWEEN '$date_today' AND DATE_ADD('$date_today', INTERVAL 30 DAY)"; $test = mysqli_query($con, $query); // 后续数据处理 if($test) { while($row = mysqli_fetch_assoc($test)) { // 在这里处理查询到的数据 } } else { echo mysqli_error($con); // 打印错误信息,方便排查问题 }
安全预处理版(推荐)
为了避免SQL注入,使用mysqli的预处理语句更稳妥:
$date_today = '04-28-2018'; // 准备预处理语句 $stmt = mysqli_prepare($con, "SELECT * FROM registration WHERE expiration_date BETWEEN ? AND DATE_ADD(?, INTERVAL 30 DAY)"); // 绑定参数,"ss"表示两个参数都是字符串类型 mysqli_stmt_bind_param($stmt, "ss", $date_today, $date_today); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); // 遍历数据 while($row = mysqli_fetch_assoc($result)) { // 处理你的数据 } // 关闭语句 mysqli_stmt_close($stmt);
额外注意事项
如果你的expiration_date字段是字符串类型(不是DATE/DATETIME),建议先把它转换成DATE类型再比较,避免因格式问题导致的匹配错误:
WHERE STR_TO_DATE(expiration_date, '%m-%d-%Y') BETWEEN STR_TO_DATE('$date_today', '%m-%d-%Y') AND DATE_ADD(STR_TO_DATE('$date_today', '%m-%d-%Y'), INTERVAL 30 DAY)
内容的提问来源于stack exchange,提问作者Drenyl
相关产品推荐
相关产品推荐

