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

MySQL查询到期日距今日30天内的数据失败求助

解决你的SQL查询问题

看来你的查询语句有几个关键问题导致无法正常运行,我来帮你拆解修复:

原查询的核心错误

  1. BETWEEN子句语法错误:BETWEEN的正确用法是 字段 BETWEEN 值1 AND 值2,你用括号把两个值括起来的写法不符合MySQL语法,而且还漏掉了闭合括号,这会直接触发语法报错。
  2. 日期计算逻辑颠倒:你要找的是「到期日距今日30天内」的数据,也就是到期日落在今日到今日往后30天的区间里。但你用了DATE_SUB(expiration_date, INTERVAL 30 DAY),这是把到期日往前推30天,逻辑完全搞反了,应该用DATE_ADD()来计算今日之后的30天。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:18:35